如何向另一个进程(例如记事本)发送按键?

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

为什么无法正常工作,是否有可能修复它?


可能是创建一个屏幕键盘的重复问题,还有https://dev59.com/MHM_5IYBdhLWcg3wzmkw?rq=1和无数其他问题。 - tenfour
尝试使用SendInput http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx - jsist
你正在向记事本窗口发送虚假输入,而你应该将其发送到其中包含的编辑框中。 - Matteo Italia
请参见https://dev59.com/kGkv5IYBdhLWcg3wtS8N。 - rogerdpack
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来发送按键事件。


3

我有一个记事本,它的PID是2860。

注意到你说的是2860,但调用了2680。

SendIt(2680); //记事本ID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接