PostMessage()来模拟c中的输入?
我正在尝试为游戏制作一个简单的僵尸程序.即使游戏失焦或最小化,我也希望它能够正常运行.因此,我不能使用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()时,权限被拒绝,并且没有返回句柄. 如果阻止此功能,有没有办法获得对另一个进程的“编辑”访问权限? 解决方法
当然,Windows永远不会让你这样做,如果你试图窃取用户的密码怎么办?当你没有焦点时,你不被允许接收输入!!
但你可能会在这里做一些技巧:你应该为鼠标或键盘编写一个钩子函数,这个函数应该在DLL(而不是你的EXE)中实现,使用SetWindowsHookEx安装它,然后在你的DLL中使用IPC机制发送鼠标和/或键盘消息到您的主要EXE. 但除此之外:虽然它通常起作用 HWND handle = FindWindow(NULL,CStringW("Untitled - Notepad")); 敌人没有任何意义,Windows必须获得至少一个字符串参数的大多数函数的版本:一个用于ANSI,其名称以A结尾,一个用于以W结尾的宽(UTF-16)字符.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") ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |