AHK中有两个命令一直都没搞明白它们的使用方法——PostMessage和SendMessage,百度的结果真的隐晦,还有说要对win32API熟悉才行,害我又去查win32API的列表找这类书籍的pdf,越查越糊涂。
现在终于都知道怎么查找了这些所谓的Message上的十六位数字是什么意思了,以及他们的参数怎么去查询
总结:这种东西还是得回去看手册,但是嘛,开始也是知道这个道理的,但是在search上怎么找都是只有PostMessage的函数解释,偶尔机会又翻看了一次又发现一些东西,特意记下来,帮助像我当初忙头苍蝇的业余选手到处撞,不需要对win32API特别熟悉也能用。
解决方法:首先理解两个函数参数放的啥玩意,然后关键是把窗口句柄,以及菜单句柄给获取到,这里就牵涉到或许这些句柄的工具了,很多介绍都不管用,光这一步都阻碍了很久,好不容易找到句柄工具了,但是不会用也是要命,离PostMessage的实现只差一步之遥,也就是winspy类软件的使用方法,本文用的是它windows detective
,对比发现也只有它能用。
首先,一段代码为例子,需求是在q-dir上添加额外的快捷键,但是WinMenuSelectItem
这个菜单函数调用不了,然后注释的代码是我原先的解决方案,会跟软件自带的软件冲突,所有还是得PostMessage
。
然后,PostMessage
函数,个人习惯配合#IfWinActive
一起使用,所以参数上就只含有两个,也就是命令的类型
和执行的命令(也就是句柄)
,常规的话还是有很多参数在后面跟着的,具体的话可以查手册,这里只需要用到前两个就够了。
#IfWinActive ahk_exe q-dir.exe
^+n:: ;新建文件夹
;send !vwf
PostMessage, 0x0111, 5034
return
^+t:: ;新建记事本
;send !vwt
PostMessage, 0x0111, 5048
return
^+s:: ;新建快捷方式
;send !vws
PostMessage, 0x0111, 5035
return
#IfWinActive
这里是最大的关卡,因为业余一直找不到正确的开启办法
图片上的很多都是绿色版,不知道为什么就是用不了,没有一个能打!! 然后无意间发现个windows detective
客户端,终于等到了!!
打开之后首先捕捉一个窗口
然后打开message,
打开过滤器 exclude全部只留下wm_command
,然后就去q-dir.exe
软件通过菜单执行新建文件夹或自己想实现的操作
然后回去看message就可以看到,注意,定位一定要准确,定位到菜单栏,否则message会没东西的
然后就可以配合postmessage
生成相应快捷键了,就像开头解释的那样了
附:0x0111
的类型是 WM_COMMAND,点击菜单, 点击子窗口按钮。也就是功能就是专门点击菜单用
而下面这个0x0112
则是 WM_SYSCOMMAND 点击窗口标题栏右键菜单
都
关于命令类型,可以从下面的消息列表查看,确实挺多的,真学无止境,要想实现其他非点击菜单的命令,确实得熟悉才行。。。
功能基本够用就行,多也记不住,折腾不来
也不怪得找不到什么教程,试了一圈,记事本和资源管理器的句柄都捕获不了,也就只有Q-dir可以,其他程序更是只显示只要一个窗体,连菜单句柄都没有。一个词总结就是,难用!!! 新版本窗体控件开发的都抓不,就是个WinMenuSelectItem
的替代品,而且都是淘汰产品。
因为关注点在sendmessage的函数方法的使用上,而没有发现两个
sendmessage的使用方法
windows消息列表
WinMenuSelectItem的函数,这个除了记事本其他程序都没成功过。
sendmessage/postmessage函数
官方win32API介绍 ——wm-syscommand
照着AHK给的例子写了几个,还看了官方API扩展了些
业余的应该也就能实现这些了,不然给的例子也不会那么普通
#1:: ;改标题,操作窗体 0x000C is WM_SETTEXT
SendMessage, 0x000C, 0, "New Title"
return
#2:: ;有些窗体操作需要配合其他函数 WM_VSCROLL := 0x0115
ControlGetFocus, control, A ;上滑
SendMessage, 0x0115 , 0, 0, %control%, A
return
#3:: ;水平右滑
ControlGetFocus, control, A ;窗体 WM_HSCROLL := 0x0114
SendMessage, 0x0114, 1, 0, %control%, A
return
#4:: 下滑;
ControlGetFocus, control, A
SendMessage, 0x0115, 1, 0, %control%, A
return
#5:: ;关闭窗口
SendMessage, 0x0010
return
;#e:: ;这个是win消息列表 移动窗体,可能得结合相关参数
;SendMessage, 0x0003 ;并不能直接用
;return
#e:: ;换了种方式 通过system command指令 WM_SYSCOMMAND := 0x0112
PostMessage, 0x0112,0xF010 ;通过WM_SYSCOMMAND的官网API查到 SC_MOVE 0xF010
return
#e:: ;换了种方式 换成十进制一样是可以的
PostMessage, 0x0112,61456
;在窗口句柄捕捉工具摸索不了什么,因为都唔说明函数,且每种命令类型的用法不一样
;然后利用 举一反三,鉴于自己IDE知识水平,实现的功能有限,
;可以说只有点击菜单栏有用,其他都不如直接用快捷键组合更好理解和修改