4

我正在尝试为游戏制作一个简单的机器人程序。即使游戏失焦或最小化,我也希望它能够正常工作。因此,我不能使用 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()时获取了原来的句柄但是权限被拒绝,没有返回句柄。

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

4

2 回答 2

1

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

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

但除此之外:虽然它通常可以正常工作

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

敌人没有任何意义,windows 必须对大多数函数进行版本化,这些函数至少获得一个字符串参数:一个用于 ANSI,其名称以 . 结尾,A另一个用于以W. MSVC 在此设计之上有一个额外的层,称为并通过使用定义将所有此类函数映射到 ANSI 或 Wide,因此如果您使用该版本的 API,直接使用生成宽字符串TCHAR是不明智的。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") );
于 2012-11-08T00:00:51.247 回答
0

您确定您尝试向其发送文本的游戏拥有一个可以从客户端的子项中枚举的 Windows 编辑控件吗?您所指的编辑控件很可能是客户端图形容器的一个实体。如果是这种情况,您可能必须向客户端窗口本身发送WM_KEYDOWN消息WM_KEYUP才能实现所需的功能。

希望有帮助。

于 2013-06-27T08:10:31.793 回答