如何使用python挂钩窗口中的事件/消息

Ber*_*ala 9 python windows wmi power-management

简而言之:

我想拦截我的笔记本电脑上的暂停/待机消息,但我的程序没有收到所有相关消息.

背景:

在Windows xp/2k上有一个ms-excel中的错误,如果在网络/ USB驱动器上打开文件,则会阻止系统挂起.

我正在尝试以编程方式解决它(我的工具箱包括python,vb6或命令行工具).

我对Windows仪器一无所知:-)

我有一个sysinternals实用程序,无论如何暂停系统.我想把它挂钩到封闭式活动!

长:

笔记本电脑盖关闭(fujitsu u810)启动待机程序[如何?]

然后系统发送每个人WM_POWERBROADCAST:PBT_APMQUERYSUSPEND(我可以使用它跟踪它们SPYXX.EXE)

每个程序回答"True",直到excel回答"false",整个​​过程停止.

我的问题:

1)我的python程序既没有捕获pbm_apmquerysuspend,也没有捕获PBT_APMQUERYSTANDBYFAILED,也没有捕获PBT_APMQUERYSUSPENDFAILED:`...

query = "SELECT * FROM Win32_PowerManagementEvent"

power_watcher = wmi.ExecNotificationQuery ( query )

power_event = power_watcher.NextEvent ()
Run Code Online (Sandbox Code Playgroud)

`如果最终发生备用,它只接收PBT_APMSUSPEND.

为什么不 - 我该如何拦截呢?

2)是否有其他方法可以拦截备用流程?

在一个完美的世界里,我会设置lid-close事件来运行我选择的命令.在完美的世界中,盖子盖是一个有记录的事件.

谢谢你们 :-)

Ber*_*ala 2

我发现了一个丑陋的解决方法:我编写了一个AutoIt脚本,它检测 Excel 的错误 MessageBox,关闭它,然后运行 ​​sysinternals 的实用程序,强制计算机进入待机状态。

Opt("WinWaitDelay",400)
; -- 精确的文本匹配,节省大量杯子周期!
Opt("WinTitleMatchMode",3)
Opt("WinDetectHiddenText",1)
Opt("鼠标坐标模式",0)
; Opt("WinSearchChildren",1)
暗淡的$title =“Microsoft Excel”
dim $text = "Windows 无法进入待机状态,因为正在从网络访问 Microsoft Office 文档或应用程序组件。您必须关闭打开的文档或退出应用程序,然后才能使计算机进入待机状态。"
虽然真实
     ; 等待Excel的错误消息
     WinWait($标题,$文本)
     运行(“psshutdown.exe -c -d -accepteula -m mooshmoosh -t 5”)
     ; 如果没有“睡眠”,烦人的消息框不会关闭
     睡眠(1000)
     ; 关闭烦人的模态消息框!
     WinClose($标题)
     ;1分钟延迟,节省CPU(?)
     睡眠(1*60*1000)
西结束

(这是一个优化版本 - 第一次试验是 CPU 密集型的)。
现在它位于系统托盘中并且可以正常工作。

丢失消息的问题仍然悬而未决。虽然我意识到它首先与 python 无关。