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

时间:2012-04-02 22:34:46

标签: c++ winapi sendmessage

我想在编辑框中以编程方式在其他程序中设置文本,这是一个游戏应用程序并使用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是正确的,但文本没有更新...它发送到正确的句柄,但没有更新....我想我需要以某种方式集中或更新,一旦它更新成功,但我没有意识到发生了什么。 ..所以代码工作了一次,但没有更多工作...为什么一次有效?

2 个答案:

答案 0 :(得分:4)

你的问题是金钱!的严重即可。让我们说一只小鸟告诉我你感兴趣的游戏是什么(以 S 开头)。我已经花了几个小时自己解决这个问题而且我已经取得了一些成功,所以我会与你分享。

有一个名为Spy++的工具(来自Microsoft)让您可以观看发送到窗口/类的消息。这非常适合调试,因为它允许您监视在键盘上按下键时发送到编辑框的消息,这样您就可以找到发送到游戏的确切调用和参数来模拟此操作。

使用spy ++打开游戏过程,一旦你进入Game的登录窗口,你会看到spy ++报告在这个过程中打开了几个线程,但只有一个线程将有3个EDIT框。那是你感兴趣的主题!

另请注意,两个EDIT框都没有标题,因此以下代码将永远不会起作用:

HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL);

顺便说一句,总是确保FindWindowEx()返回有效的内容,否则你怎么知道它找到了编辑框?

你应该做的是:

HWND edit = FindWindowEx(hWnd, NULL, "", NULL);
if (!edit)
{
    // report error
}

这将找到第一个EDIT框。此框对应于用户名框。该游戏使用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 ++将揭示其他参数是什么,不用担心。您可能会花一些时间来确定如何构建调用的最后一个参数(因为它是一个掩码)。

如果游戏被最小化或没有焦点,我就无法向游戏发送密钥。你将不得不想出这个。出于测试目的,使用可以使用SetForegroundWindow(window_hwnd);和更多东西来关注窗口。

答案 1 :(得分:2)

查找Autoit.的源代码 Autoit能够将键/鼠标发送到几乎任何东西。 安装较新版本的卡巴斯基反病毒软件时,它会在进程之间混合SendMessage|SendInput类型。

编辑: 对于那些指出Autoit是一大堆代码来完成这项任务的人来说:

Autoit能够将输入发送到不希望看到注入输入的后台应用程序。这不是一件轻而易举的事。有些游戏不希望看到任何形式的任何脚本输入,他们会竭尽全力阻止它。此外,还有野外的AV解决方案可以阻止进程间输入注入。在很多情况下,Autoit以某种方式在块周围工作。