使用SendMessage将文本输入到属于另一个进程的编辑控件中

Using SendMessage to enter text into an edit control belonging to another process

本文关键字:进程 编辑 控件 另一个 属于 SendMessage 文本 输入 使用      更新时间:2023-10-16

我想在其他程序中用程序设置编辑框中的文本,这是一个游戏应用程序,使用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在很多情况下都能绕过街区。