PostMessage/SendMessage 教程 - AutoHotkey
文章推薦指數: 80 %
PostMessage 的另一个好处是窗口可以在后台; 与之相比, 发送鼠标点击要求目标窗口必须 ... 挂起正在运行的AHK 脚本的热键DetectHiddenWindows, on SetTitleMatchMode, ...
发送消息到窗口或其控件
作者:Rajat
本页讨论PostMessage和SendMessage命令并将回答这样一些问题:
"如何按下已最小化窗口中的按钮?"
"当WinMenuSelectItem不起作用时,我如何选择一个菜单项?!"
"这是个可更换皮肤的窗口....如何确保我每次发送的命令都有效?"
"如果是隐藏窗口呢?!"
要求:AutoHotkeyv1.0.09+和WinspectorSpy(http://www.softpedia.com/get/Security/Security-Related/Winspector.shtml)
像第一个例子那样,请注意WinMenuSelectItem对OutlookExpress的"NewMessage"窗口中的菜单栏无效.换句话说,这代码不起作用:
WinMenuSelectItem,NewMessage,,&Insert,&Picture...
但PostMessage能实现这个操作:
PostMessage,0x111,40239,0,,NewMessage
太神奇了!但那个是什么?0x111是wm_command消息的十六进制代码,而40239是这个特殊窗口理解为选择'InsertPicture'菜单项的代码.现在让我告诉您如何找到类似40239这样的值:
启动WinspectorSpy,打开"NewMessage"窗口.
拖动WinspectorSpy窗口中的十字线到"NewMessage"窗口的标题栏(没有被WinspectorSpy覆盖的部分).
在左边的列表中右键点击所选窗口并选择'Messages'.
右键点击空白窗口并选择'Editmessagefilter'.
点击'filterall'按钮,然后双击左边列表中的'wm_command'.这样您将只监视此消息.
现在转到"NewMessage"窗口并在菜单栏中选择:Insert>Picture.
返回WinspectorSpy并按下信号灯按钮来停止监视.
展开收集到的wm_command消息(忽略其他的).
您想要找的(通常)是代码为0的消息.有时会有一些描述为'winactivated'或'windestroyed'以及其他..的wm_command消息都是不需要的内容.您会发现描述为'ControlID:40239'的消息...就是它了!
现在把它放入上面的命令中您就完成了!它就是wParam值.
在下一个例子中我会使用画图程序,因为很可能每个人都会有.现在假设我们要使用AutoHotkey从工具栏中选择一个工具;假设要选择取色工具.
您会怎么做?很可能是使用鼠标点击工具栏,对吗?但是按钮可能被移动且隐藏了!这个画图程序的工具栏也可能被移动/隐藏.所以如果目标用户这么做了,那么您的脚本在这个点上会失效.但是下面的命令仍然有效:
PostMessage,0x111,639,,,untitled-Paint
PostMessage的另一个好处是窗口可以在后台;与之相比,发送鼠标点击要求目标窗口必须是活动的.
这里有其他的例子.请注意:我使用的是WinXPPro(SP1)...如果您使用不同的操作系统,那么您的参数可能要改变(仅适用于像写字板和记事本这类windows自带的应用程序;其他的程序应该不用改变):
;设置写字板字体为青色
PostMessage,0x111,32788,0,,Document-WordPad
;打开记事本的关于对话框
PostMessage,0x111,65,0,,Untitled-Notepad
;切换记事本的自动换行属性
PostMessage,0x111,32,0,,Untitled-Notepad
;在WindowsMediaPlayer中播放/暂停
PostMessage,0x111,32808,0,,WindowsMediaPlayer
;挂起正在运行的AHK脚本的热键
DetectHiddenWindows,on
SetTitleMatchMode,2
PostMessage,0x111,65305,,,MyScript.ahk-AutoHotkey;和挂起操作不同,必须使用65306来暂停。
上面讲的是PostMessage.SendMessage的工作方式相同,不过还会等待返回值,这个值可用于一些情况中,例如获取Winamp中当前正在播放的曲目(请参阅自动化Winamp的例子).
这里是一些注意事项:
上文也提到了操作系统是XP且需要注意消息值随着不同的操作系统而改变.如果您发现一个消息在您的系统上有效(对于一个软件的某个版本),那么在其他系统上它对于这个软件的相同版本仍然是有效的.此外,大多数应用程序甚至会在它们的不同版本中使用相同的消息值(例如WindowsMediaPlayer和Winamp).
如果您已经在WinspectorSpy中设置了过滤器来只显示wm_command消息,却仍然得到大量的消息时,请右键点击那些不需要的消息并选择隐藏(消息名)...这些消息一般是不是由于您和目标软件交互所产生的消息.
在WinspectorSpy中向右的箭头显示消息值,而模糊的左箭头显示返回值.返回值0(零)默认情况下可以安全地认为'没有错误'(与SendMessage一起使用,返回值会存储在%ErrorLevel%).
要传递消息到匹配部分标题的窗口,请添加此行到脚本:
SetTitleMatchMode,2
要传递消息到隐藏窗口,请添加此行到脚本:
DetectHiddenWindows,On
注:此技术对某些应用程序无效.我对VB和Delphi编写的应用程序只能侥幸.此技术最适用于C,C++编写的应用程序.对于VB应用程序相同命令的'LParam'参数在传递时总是变化的.对于Delphi应用程序...一些程序的GUI甚至不使用wm_command.它或许使用鼠标位置和点击吧.
去探索吧....并且记得在AutoHotkey论坛分享您的经验.欢迎反馈!
这个指南并不是为新手们准备的(没有冒犯的意思),因为这些命令被认为是高级功能.所以如果读完本文,您还是摸不着头脑,请忘了它吧。
-Rajat
延伸文章資訊
- 1AHK積木 - AHK 語法產生器
請問一下後台要點擊Esc Ctrl的話要怎麼寫? 王竣平 • 3 月之前. 可以直接拼湊[送出按鍵]積木哦 [Esc]的積木可以 ...
- 2[求助] AHK 後台自動開始- 腳本專區 - 冰楓論壇
想請教一下前輩們,後台自動開始怎寫,用ControlClick寫只有點擊功能,鼠標不會移動到指定的座標。 AHK 後台自動開始.
- 3autohotkey後台教學 - 軟體兄弟
autohotkey後台教學,为方便初次接触脚本的朋友,这里选取一些通俗易懂的基础入门教程,经适当整理(以反映目前AutoHotkey 现状)后集中发表,以方便无任何脚本和编程 ...
- 4【問題】AHK可以後臺操作嗎? - 哈啦區
- 5AHK编写的脚本怎么后台运行啊? - 知乎
问题没有看见代码,从描述和问题本身来推测,应该是希望脚本可以在后台,需要的时候调用一下。 我有两个简单的思路,有不对的地方请朋友们指正。