使用SendMessage将文本输入到属于另一个进程的编辑控件中
Using SendMessage to enter text into an edit control belonging to another process
我想在其他程序中用程序设置编辑框中的文本,这是一个游戏应用程序,使用directX,但在窗口模式下运行。我在做这个:
HWND hWnd = FindWindow(NULL,"Game");
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL);
SendMessage(edit, WM_CHAR, (TCHAR) 'H', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'E', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'O', 0);
这对我不起作用……但有些曾经起过作用。我想我误解了一些东西,也许它必须集中在编辑控件上,然后设置光标,然后粘贴文本,然后禁用焦点。。。我真的不太了解。。。请节省我的时间和勇气,告诉我如何使它工作。。。。
我也试过了,但没有成功:
SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"text");
hwnd是正确的,但文本没有更新。。。它发送到正确的句柄,但没有更新。。。。我想我需要以某种方式专注或更新,一旦更新成功,但我没有意识到发生了什么。。。所以代码工作过一次,但不再工作了。。。为什么有一次成功了?
你的问题是钱说真的。比方说,一只小鸟告诉我你感兴趣的游戏是什么(以s开头)。我在这个问题上花了几个小时,我已经取得了一些成功,所以我将与大家分享。
有一个名为Spy++(来自Microsoft)的工具,可以让您监视发送到窗口/类的消息。这非常适合调试,因为它允许您在按下键盘上的键时监视发送到EDIT框的消息,这样您就可以找到发送到游戏的确切调用和参数来模拟此操作。
使用spy++打开游戏进程,一旦您进入游戏的登录窗口,您将看到spy++报告在此进程中打开了多个线程,但只有一个线程将有3个编辑框。这就是你感兴趣的线索!
还要注意,两个EDIT框都没有标题,因此以下代码永远不会工作:
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL);
顺便说一句,始终确保FindWindowEx()
返回有效的内容,否则你怎么知道它成功找到了编辑框?
你应该做的是:
HWND edit = FindWindowEx(hWnd, NULL, "", NULL);
if (!edit)
{
// report error
}
这将找到第一个编辑框。此框对应于用户名框。游戏使用3个PostMessage()
调用来模拟按键,并且而不是您尝试的SendMessage()
:
// "..." means you need to find out the other parameters
PostMessage(edit, WM_KEYDOWN, ...);
PostMessage(edit, WM_CHAR, ...);
PostMessage(edit, WM_KEYUP, ...);
Spy++将揭示其他参数是什么,别担心。您可能会花一些时间弄清楚调用的最后一个参数是如何构建的(因为它是一个掩码)。
如果游戏被最小化或没有焦点,我就无法发送游戏密钥。你必须弄清楚这个。出于测试目的,use可以使用SetForegroundWindow(window_hwnd);
和其他一些东西来聚焦窗口。
查找Autoit的源代码。Autoit可以向任何东西发送按键/鼠标。当安装新版本的卡巴斯基反病毒软件时,它会在进程之间干扰SendMessage|SendInput
类型的东西。
编辑:对于那些指出Autoit是一个巨大的代码块来完成这项任务的人来说:
Autoit能够将输入发送到不希望看到注入输入的后台应用程序。这不是一件容易完成的小事。有些游戏不想看到任何形式的脚本输入,他们会尽力阻止它。此外,还有一些AV解决方案可以阻止进程间输入注入。Autoit在很多情况下都能绕过街区。
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 编辑文件中的文本
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- SetDlgItemInt 不会更改嵌入资源的编辑框
- 终止 QProcess 不会终止子进程
- 如何编辑受保护的进程内存?
- 两个进程之间的共享映射内存在编辑时未更新
- 使用SendMessage将文本输入到属于另一个进程的编辑控件中
- 编辑其他进程内存
- 进程间内存编辑-查找更改的地址
- 编辑android init.rc以供第三方守护进程重新启动