【发布时间】:2015-01-27 02:02:53
【问题描述】:
这让我大吃一惊。我正在对一个 Java 项目进行逆向工程,该项目旨在实现某些桌面任务的宏观自动化。与其他主动移动现实光标的程序不同,该项目通过 WinApi 发送消息。这使得应用程序认为在实际用户输入没有中断并且其他程序不受影响的情况下使用了单击/键入。很久以前就想过类似的事情,但不知道怎么做。
对于在字段中输入字符串,该项目使用了非常简单的方法:
public void typeString(String text) {
for (char key : text.toCharArray()) {
sendMsg(258, key, 0);
}
}
其中 sendMsg 包含 winapi SendMessage 调用:
SendMessage(hwnd, 258, key, 0);
嗯,这对abcd 之类的东西有效也就不足为奇了。但即使对于带有变音符号的字符,我也能做到!
现在我预计会出现诸如损坏的功能键操作之类的东西。我对这件事的问题是:
- 这是否适用于所有平台?至少对于 unicode 应用程序?
- 如何输入功能键?
【问题讨论】:
-
好吧,
258是WM_CHAR标志。您可能需要WM_KEYDOWN和WM_KEYUP消息,但随后您需要弄清楚SendMessage的(最后一个)两个参数的期望 -
所以,我想
WM_KEYDOWN和WM_KEYUP和 Windows Virtual KeyCode 的组合应该会有所帮助... -
感谢@RemyLebeau 指出这一点。但是,如果一个应用程序会尝试检测和抵消我的程序,我可能会让他们这样做。
-
它怎么能做到这一点?输入消息不携带任何发送者信息。如果您真的害怕在特定程序中看起来像恶意软件,那么使用该程序公开的任何 API(如果不是可访问性框架),您可能会感觉更自在。否则,
SendInput()是设计的 并且是指定做你想做的事,正如链接文章所解释的那样。
标签: java winapi sendmessage