c++ - 如何将击键发送到其他进程(例如记事本)?

标签 c++ windows winapi sendmessage sendkeys

我有一个 PID 为 2860 的记事本

#include <iostream>
#include <windows.h>
#include <psapi.h>
using namespace std;
HWND SendIt (DWORD dwProcessID){
    HWND hwnd = NULL;
    do {
         hwnd = FindWindowEx(NULL, hwnd, NULL, NULL);
         DWORD dwPID = 0;
         GetWindowThreadProcessId(hwnd, &dwPID);
         if (dwPID == dwProcessID) {
            cout<<"yay:"<<hwnd<<":pid:"<<dwPID<<endl;//debug
            PostMessage(hwnd,WM_KEYDOWN,'A',1); //send
         }
    } while (hwnd != 0);
    return hwnd; //Ignore that

}
int main()
{
    SendIt(2680); //notepad ID
    return 0;
}

记事本应该写入 A 但没有任何反应。
我在上面尝试了 WM_DESTROY 消息,它正在工作,但 WM_KEYDOWN 不工作。
我还完成了 GetLastError() 并打印错误 2 ERROR_FILE_NOT_FOUND

为什么这不起作用,是否可以修复?

最佳答案

应该使用 PostThreadMessage。

hThread = GetWindowThreadProcessId(hwnd,&dwPID);  
if (dwPID == dwProcessID && hThread!= NULL ) {
   PostThreadMessage( hThread, WM_KEYDOWN,'A',1);
}

两个进程必须由同一用户创建。否则,函数失败并返回 ERROR_INVALID_THREAD_ID。

如果其他进程是捕获键盘输入的事件窗口,SendInput 或 keybd_event 也可用于发送击键事件。

关于c++ - 如何将击键发送到其他进程(例如记事本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12099957/

相关文章:

c++ - WM_MENUSELECT 未在 CFrameWndEx 窗口中处理

windows - 我如何将 Pyqt 与 Enthought Canopy 一起使用

windows - 带注释的标签不适用于 64 位 Windows 命令控制台

c++ - 使用 WaveOutOpen(C++) 播放 .wav

c# - 如何创建仅允许访问 C++ 中特定用户帐户的手动重置事件?

c++ - 以元音、辅音开头的单词的读数

c++ - 编译时出现TBB错误

c++ - Qt C++ 和 QSerialDevice : Windows 7 USB->Serial Port Reading/Writing

java - 如何在windows下用java运行linux程序?

c++ - 根据 Windows 版本更改控件的视觉样式