Page 1 of 1

[v2] hawkeye() 监听窗口

Posted: 28 Aug 2015, 07:15
by arcticir

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 窗口切换

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

Posted: 28 Aug 2015, 08:08
by RobertL
实例应用涵盖全面,很诱人...

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

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

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

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

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

其他:SystemParametersInfo函数,SPI_SETDESKWALLPAPER参数,可以用于改变壁纸。

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

Posted: 29 Aug 2015, 07:06
by td3zzz
mark

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

Posted: 31 Aug 2015, 04:20
by Array
great! 潮汐好牛逼。

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

Posted: 31 Aug 2015, 05:13
by arcticir
你是说如何判断这个窗口是新出现的?
判断Window[hwnd] 有没有就行了。

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

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

监控子窗口的问题论坛刚有讨论下怎样能监视这个窗口的出现?

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

Posted: 01 Sep 2015, 20:40
by Array
http://ahkscript.org/boards/viewtopic.php?f=6&t=6463

使用这个库不就可以了吗?

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

Posted: 06 Sep 2015, 07:48
by RobertL
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中文论坛\窗口监控相关

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

Posted: 16 Sep 2015, 01:46
by Array
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:

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

Posted: 21 Jul 2016, 08:00
by arcticir
更新掉失效旧代码。