PostMessage()在c ++中模拟输入?

时间:2012-11-07 23:42:39

标签: c++ sendmessage sendkeys postmessage sendinput

我正在尝试为游戏制作一个简单的僵尸程序。即使游戏失焦或最小化,我也希望它能够正常运行。因此,我不能使用SendInput()来模拟全局事件。我想出来,为了使这项工作,我必须使用PostMessage()函数。我制作了一个模拟记事本输入的测试程序:

#include <Windows.h>
HWND handle = FindWindow(NULL,CStringW("Untitled - Notepad"));
HWND edit = FindWindowEx(handle, NULL, CStringW("Edit"), NULL);
PostMessage(edit, WM_CHAR, 'a', 0 );

此示例成功模拟了记事本中“a”的单击,即使记事本未对焦或最小化。同样我也可以使用鼠标事件。

然而,当我为我的游戏尝试同样的事情时,我无法发布点击命令。经过调查,我发现原来的句柄已经获得,但是当我调用FindWindowEx()时,权限被拒绝,并且没有返回句柄。

如果阻止此功能,是否有办法获得对其他进程的“编辑”访问权限?

2 个答案:

答案 0 :(得分:1)

当然Windows永远不会让你这样做,如果你试图窃取用户的密码怎么办?当你没有焦点时,你不被允许接收输入!!

但你可能会在这里做一些技巧:你应该为鼠标或键盘编写一个钩子函数,这个函数应该在DLL(而不是你的EXE)中实现,使用SetWindowsHookEx来安装它然后使用IPC机制您的DLL将鼠标和/或键盘消息发送到您的主EXE。

但除此之外:虽然它通常起作用

HWND handle = FindWindow(NULL,CStringW("Untitled - Notepad"));

敌人没有任何意义,Windows必须获得至少一个字符串参数的大多数函数的版本:一个用于ANSI,其名称以A终止,一个用于宽(UTF-16)字符终止与W。 MSVC在这个设计上有一个名为TCHAR的额外层,并且使用define map将所有这些函数用于ANSI或Wide,所以如果你使用的是那个版本的API,那么直接使用CStringW是不明智的。生成宽字符串。由于Windows API与char*wchar_t*一起使用,为什么要将字符串文字转换为CString然后将其传递给函数?你应该使用其中一个:

// This also work with CStringA
HWND handleA = FindWindowA(NULL, "Untitled - Notepad");
// This also work with CStringW
HWND handleW = FindWindowW(NULL, L"Untitled - Notepad");
// This also work with CString
HWND handleT = FindWindow(NULL, _T("Untitled - Notepad") );

答案 1 :(得分:0)

你确定你试图发送文本的游戏拥有一个可以从客户端的孩子中枚举的Windows编辑控件吗?您所指的Edit控件很可能是Client的图形容器的实体。如果是这种情况,您可能需要将WM_KEYDOWNWM_KEYUP消息发送到客户端窗口本身以实现所需的功能。

希望有所帮助。