本页解释如何通过 PostMessage 或 SendMessage 向窗口或窗口控件发送消息, 并将回答如下问题:
需要: Winspector Spy(可在此处下载)
像第一个例子那样, 请注意 MenuSelect 对 Outlook Express 的 "New Message" 窗口中的菜单栏无效. 换句话说, 这代码不起作用:
MenuSelect "New Message",, "&Insert", "&Picture..."
但 PostMessage 能实现这个操作:
PostMessage 0x111, 40239, 0, , "New Message"
太神奇了!但那个是什么? 0x111 是 wm_command 消息的十六进制代码, 而 40239 是这个特殊窗口理解为选择 'Insert Picture' 菜单项的代码. 现在让我告诉您如何找到类似 40239 这样的值:
在下一个例子中我会使用画图程序, 因为很可能每个人都会有. 现在假设我们要使用 AutoHotkey 从工具栏中选择一个工具; 假设要选择取色工具.
您会怎么做? 很可能是使用鼠标点击工具栏, 对吗? 但是按钮可能被移动且隐藏了! 这个画图程序的工具栏也可能被移动/隐藏. 所以如果目标用户这么做了, 那么您的脚本在这个点上会失效. 但是下面的函数仍然有效:
PostMessage 0x111, 639,,, "Untitled - Paint"
PostMessage 的另一个好处是窗口可以在后台; 与之相比, 发送鼠标点击要求目标窗口必须是活动的.
这里有其他的例子. 请注意: 我使用的是 WinXP Pro(SP1) ... 如果您使用不同的操作系统, 那么您的参数可能要改变(仅适用于像写字板和记事本这类 windows 自带的应用程序; 其他的程序应该不用改变):
;设置写字板(Wordpad) 字体为青色 PostMessage 0x111, 32788, 0, , "Document - WordPad"
;打开记事本(Notepad) 的关于对话框 PostMessage 0x111, 65, 0, , "Untitled - Notepad"
;切换记事本的自动换行属性 PostMessage 0x111, 32, 0, , "Untitled - Notepad"
;在 Windows Media Player 中播放/暂停 PostMessage 0x111, 32808, 0, , "Windows Media Player"
;使用 65306 来 Pause, 而 65303 来 Reload, 从而代替下面的 Suspend. (请参阅 FAQ) PostMessage 0x111, 65305,,, "MyScript.ahk - AutoHotkey"
; 按下 CapsLock 和 Numpad2 重新加载所有 AutoHotkey 脚本 CapsLock & Numpad2:: ReloadAllAhkScripts(ThisHotkey) { DetectHiddenWindows True for hwnd in WinGetList("ahk_class AutoHotkey") { if (hwnd = A_ScriptHwnd) ; 重新加载时忽略当前窗口 continue PostMessage 0x111, 65303,,, hwnd } Reload }
上面这个示例针对 PostMessage. SendMessage 的工作方式是一样的, 但另外会等待一个返回值, 这可以用于诸如在 Winamp 中获取当前正在播放的曲目(请参阅自动化 Winamp 的例子).
这里是一些注意事项:
DetectHiddenWindows True
注: 此技术对某些应用程序无效. 我对 VB 和 Delphi 编写的应用程序只能侥幸. 此技术最适用于 C, C++ 编写的应用程序. 对于 VB 应用程序相同函数的 'LParam' 参数在传递时总是变化的. 对于 Delphi 应用程序... 一些程序的 GUI 甚至不使用 wm_command. 它或许使用鼠标位置和点击吧.
去探索吧.... 并且记得在 AutoHotkey 论坛分享您的经验. 欢迎反馈!
这个指南并不是为新手们准备的(没有冒犯的意思), 因为这些函数被认为是高级功能. 所以如果读完本文, 您还是摸不着头脑, 请忘了它吧.
-Rajat