[v2] hawkeye() 监听窗口

许多实用脚本和封装函数, 可以让您编写脚本更加便捷高效

Moderators: tmplinshi, arcticir

arcticir
Posts: 694
Joined: 17 Nov 2013, 11:32

[v2] hawkeye() 监听窗口

28 Aug 2015, 07:15

Code: Select all

hawkeye(){
	DllCall("RegisterShellHookWindow", "ptr", A_ScriptHwnd)
	OnMessage(DllCall("RegisterWindowMessage", "Str", "ShellHook"), hawkeye_evente)
}

hawkeye_evente(wParam, lParam){

}
1 顶级窗体被创建
2 顶级窗体即将被关闭
3 SHELL 的主窗体将被激活
4 顶级窗体被激活
5 顶级窗体被最大化或最小化
6 Windows 任务栏被刷新,也可以理解成标题变更
7 任务列表的内容被选中
8 中英文切换或输入法切换
9 显示系统菜单
10 顶级窗体被强制关闭
11
12 没有被程序处理的APPCOMMAND。见WM_APPCOMMAND
13 wParam=被替换的顶级窗口的hWnd
14 wParam=替换顶级窗口的窗口hWnd
&H8000& 掩码
53 全屏
54 退出全屏
32772 窗口切换
User avatar
RobertL
Posts: 546
Joined: 18 Jan 2014, 01:14
Location: China

Re: [HV2] 窗口监视模块 - Hawkeye

28 Aug 2015, 08:08

实例应用涵盖全面,很诱人...

貌似/未验证。子窗口的消息(如,最大化/最小化),需要监其窗口类中指定的消息处理过程,可以由窗口类并用钩子的方式获取一切窗口(含子窗口)的消息,但各个子窗口实例化时指定的消息处理过程可能各异,所以看需求用钩子..

你列的消息类型出自来?怎么上面的项目比MSDN描述的还多呢?→以上用的RegisterShellHookWindow函数,我理解为SetWindowsHookEx函数了。

顶级窗口即桌面级的窗口吧?→属于桌面的,非Owned窗口,即,属于桌面的独立窗口。

“如果进程创建时没有创建窗口就无法监听进程的创建事件”即,进程创建的第一个窗口无法监听?→如果一个线程中没有窗口,系统是不会给他提供消息队列的,命令是直接被发送,进而无法使用钩子来监控

参见:
MSDN中窗口相关的部分(英文),钩子部分Hooks Overview消息类型 ShellProc callback function (Windows)
RegisterShellHookWindow怎样能监视这个窗口的出现?

其他:SystemParametersInfo函数,SPI_SETDESKWALLPAPER参数,可以用于改变壁纸。
Last edited by RobertL on 31 Aug 2015, 04:37, edited 5 times in total.
我为人人,人人为己?
User avatar
Array
Posts: 5
Joined: 22 Dec 2013, 08:48

Re: [HV2] 窗口监视模块 - Hawkeye

31 Aug 2015, 04:20

great! 潮汐好牛逼。
arcticir
Posts: 694
Joined: 17 Nov 2013, 11:32

Re: [HV2] 窗口监视模块 - Hawkeye

31 Aug 2015, 05:13

你是说如何判断这个窗口是新出现的?
判断Window[hwnd] 有没有就行了。
User avatar
RobertL
Posts: 546
Joined: 18 Jan 2014, 01:14
Location: China

Re: [HV2] 窗口监视模块 - Hawkeye

31 Aug 2015, 09:54

突然有个问题,WinWait是否可行,是否可以同时开启多个监控,是否无需多线程。
如果可以,把需要监控的东西放到各个伪线程中等待就行了吧...不知道内部是不是也是通过监听实现的。

监控子窗口的问题论坛刚有讨论下怎样能监视这个窗口的出现?
我为人人,人人为己?
User avatar
RobertL
Posts: 546
Joined: 18 Jan 2014, 01:14
Location: China

Re: [HV2] 窗口监视模块 - Hawkeye

06 Sep 2015, 07:48

Array wrote:http://ahkscript.org/boards/viewtopic.php?f=6&t=6463

使用这个库不就可以了吗?
赞...
消息太闭塞了,得口口相传...效率何其低啊...
值得翻译,转载到中文论坛/板块。

嗯,那个OnWin还有不足,貌似是开启多进程模拟监视 :shock:
外加现在(1.0.03)还没有停止监视的功能...已反馈,说能解决

OnWin的简单翻译见AHK8帖子

关于RegisterShellHookWindow的可运行的演示,展示了可以获取到的消息。
主要是HSHELL_WINDOWACTIVATED,较窄。

Code: Select all

;[url=https://msdn.microsoft.com/en-us/library/ms644989(v=vs.85).aspx]RegisterShellHookWindow function (Windows)[/url]
;[url=https://msdn.microsoft.com/en-us/library/ms644991(v=vs.85).aspx]ShellProc callback function (Windows)[/url]
;[url=http://ahkscript.org/boards/viewtopic.php?f=28&t=9324][HV2] 窗口监视模块 - Hawkeye - AHKScript (an AutoHotkey Forum)[/url]
;[url=https://msdn.microsoft.com/en-us/library/ms644959(v=vs.85).aspx#wh_shellhook]Hooks Overview (Windows)[/url]

DllCall("RegisterShellHookWindow", UInt,A_ScriptHwnd )
OnMessage(DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" ), "ShellHookProc" )
#q::ExitApp

ShellHookProc(wParam, lParam){
	static HSHELL:={wParam:消息号,
		(LTrim C Join,
			1:"WINDOWCREATED"
			2:"WINDOWDESTROYED"
			3:"ACTIVATESHELLWINDOW"
			4:"WINDOWACTIVATED"
			5:"GETMINRECT"
			6:"REDRAW"
			7:"TASKMAN"
			8:"LANGUAGE"	;仅ShellProc
			9:"SYSMENU"
			10:"ENDTASK"	;仅ShellProc
			11:"ACCESSIBILITYSTATE"	;仅ShellProc
			12:"APPCOMMAND"
			13:"WINDOWREPLACED"
			14:"WINDOWREPLACING"	;仅RegisterShellHookWindow
			32772:"RUDEAPPACTIVATED"	;0x8004. 仅RegisterShellHookWindow
			32774:"FLASH"	;0x8006. 仅RegisterShellHookWindow
			;MONITORCHANGED:?	;仅RegisterShellHookWindow
			;以上消息号自"WinUser.h"
			;其中除后四个,其余见"ShellProc callback function (Windows)";后四个见"RegisterShellHookWindow function (Windows)"
		)}
	static History:={}
	History.InsertAt(1,wParam,lParam)
	historyList:=""
	Loop 5
		historyList.=A_Index ":`t" HSHELL[History[A_Index*2-1]] "`n`t" History[A_Index*2] "`n"
	ToolTip %historyList%
}
后续更新见AHK中文论坛\窗口监控相关
我为人人,人人为己?
User avatar
Array
Posts: 5
Joined: 22 Dec 2013, 08:48

Re: [HV2] 窗口监视模块 - Hawkeye

16 Sep 2015, 01:46

RobertL wrote:
Array wrote:http://ahkscript.org/boards/viewtopic.php?f=6&t=6463

使用这个库不就可以了吗?
赞...
消息太闭塞了,得口口相传...效率何其低啊...
值得翻译,转载到中文论坛/板块。

嗯,那个OnWin还有不足,貌似是开启多进程模拟监视 :shock:
外加现在(1.0.03)还没有停止监视的功能...已反馈,说能解决

OnWin的简单翻译见AHK8帖子

关于RegisterShellHookWindow的可运行的演示,展示了可以获取到的消息。
主要是HSHELL_WINDOWACTIVATED,较窄。

Code: Select all

;[url=https://msdn.microsoft.com/en-us/library/ms644989(v=vs.85).aspx]RegisterShellHookWindow function (Windows)[/url]
;[url=https://msdn.microsoft.com/en-us/library/ms644991(v=vs.85).aspx]ShellProc callback function (Windows)[/url]
;[url=http://ahkscript.org/boards/viewtopic.php?f=28&t=9324][HV2] 窗口监视模块 - Hawkeye - AHKScript (an AutoHotkey Forum)[/url]
;[url=https://msdn.microsoft.com/en-us/library/ms644959(v=vs.85).aspx#wh_shellhook]Hooks Overview (Windows)[/url]

DllCall("RegisterShellHookWindow", UInt,A_ScriptHwnd )
OnMessage(DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" ), "ShellHookProc" )
#q::ExitApp

ShellHookProc(wParam, lParam){
	static HSHELL:={wParam:消息号,
		(LTrim C Join,
			1:"WINDOWCREATED"
			2:"WINDOWDESTROYED"
			3:"ACTIVATESHELLWINDOW"
			4:"WINDOWACTIVATED"
			5:"GETMINRECT"
			6:"REDRAW"
			7:"TASKMAN"
			8:"LANGUAGE"	;仅ShellProc
			9:"SYSMENU"
			10:"ENDTASK"	;仅ShellProc
			11:"ACCESSIBILITYSTATE"	;仅ShellProc
			12:"APPCOMMAND"
			13:"WINDOWREPLACED"
			14:"WINDOWREPLACING"	;仅RegisterShellHookWindow
			32772:"RUDEAPPACTIVATED"	;0x8004. 仅RegisterShellHookWindow
			32774:"FLASH"	;0x8006. 仅RegisterShellHookWindow
			;MONITORCHANGED:?	;仅RegisterShellHookWindow
			;以上消息号自"WinUser.h"
			;其中除后四个,其余见"ShellProc callback function (Windows)";后四个见"RegisterShellHookWindow function (Windows)"
		)}
	static History:={}
	History.InsertAt(1,wParam,lParam)
	historyList:=""
	Loop 5
		historyList.=A_Index ":`t" HSHELL[History[A_Index*2-1]] "`n`t" History[A_Index*2] "`n"
	ToolTip %historyList%
}
后续更新见AHK中文论坛\窗口监控相关

突然忘记onwin怎么找到,并且是怎么用的了。失忆症。。。 :shock:
arcticir
Posts: 694
Joined: 17 Nov 2013, 11:32

Re: [HV2] 窗口监视模块 - Hawkeye

21 Jul 2016, 08:00

更新掉失效旧代码。

Return to “脚本函数”

Who is online

Users browsing this forum: No registered users and 14 guests