如何将击键发送到其他进程(来自记事本)?

时间:2012-08-23 21:05:56

标签: 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

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

2 个答案:

答案 0 :(得分:3)

应该使用PostThreadMessage。

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

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

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

答案 1 :(得分:3)

  

我有一个带有PID的记事本:2860

无法注意到您正在说2860并致电2680

  

SendIt(2680); //记事本ID