5

我有一个 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

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

4

2 回答 2

3

应该使用 PostThreadMessage。

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

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

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

于 2012-08-23T21:44:17.430 回答
3

我有一个 PID:2860 的记事本

忍不住注意到你说的是 2860 并拨打了 2680

发送它(2680);//记事本ID

于 2014-09-08T11:57:02.863 回答