【问题标题】:How can winapi SendMessage possibly allow to type any character on my keyboard?winapi SendMessage 怎么可能允许在我的键盘上输入任何字符?
【发布时间】: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 之类的东西有效也就不足为奇了。但即使对于带有变音符号的字符,我也能做到!

现在我预计会出现诸如损坏的功能键操作之类的东西。我对这件事的问题是:

  1. 这是否适用于所有平台?至少对于 unicode 应用程序?
  2. 如何输入功能键?

【问题讨论】:

  • 好吧,258WM_CHAR 标志。您可能需要 WM_KEYDOWNWM_KEYUP 消息,但随后您需要弄清楚 SendMessage 的(最后一个)两个参数的期望
  • 所以,我想 WM_KEYDOWNWM_KEYUPWindows Virtual KeyCode 的组合应该会有所帮助...
  • 感谢@RemyLebeau 指出这一点。但是,如果一个应用程序会尝试检测和抵消我的程序,我可能会让他们这样做。
  • 它怎么能做到这一点?输入消息不携带任何发送者信息。如果您真的害怕在特定程序中看起来像恶意软件,那么使用该程序公开的任何 API(如果不是可访问性框架),您可能会感觉更自在。否则,SendInput()设计的 并且是指定做你想做的事,正如链接文章所解释的那样。

标签: java winapi sendmessage


【解决方案1】:

“...我键盘上的任何字符”确实取决于您的键盘。 WM_CHAR 被记录为处理 UTF-16 如果目标窗口是 Unicode (CreateWindowW)。要支持BMP 之外的字符,您应该使用WM_UNICHAR...

【讨论】:

  • 感谢您的意见。我会记住检查窗口是否是unicode。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2021-06-04
  • 2010-09-23
  • 2013-09-28
  • 1970-01-01
  • 2014-06-30
  • 2013-12-06
相关资源
最近更新 更多