简而言之:
我想在笔记本电脑上拦截挂起/待机消息,但是我的程序未收到所有相关消息。
背景:
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 ()
`
如果最终发生待机,则它仅接收PBT_APMSUSPEND。
为什么不-如何截获呢?
2)还有另一种拦截待机过程的方法吗?
在一个完美的世界中,我将设置lid-close事件以运行我选择的命令。
在理想情况下,关闭盖子是有记录的事件。
谢谢你们 :-)
最佳答案
我发现了一个丑陋的解决方法:
我写了一个AutoIt脚本来检测Excel的错误MessageBox,将其关闭,然后运行sysinternals实用程序以强制计算机进入待机状态。
Opt(“WinWaitDelay”,400)
; -精确的文字匹配,以节省很多杯赛!
Opt(“WinTitleMatchMode”,3)
Opt(“WinDetectHiddenText”,1)
Opt(“MouseCoordMode”,0)
; Opt(“WinSearchChildren”,1)
dim $ title =“Microsoft Excel”
dim $ text =“Windows无法处于待机状态,因为正在通过网络访问Microsoft Office文档或应用程序组件。必须先关闭打开的文档或退出应用程序,然后才能使计算机处于待机状态。
虽然真实
;等待Excel的错误消息
WinWait($ title,$ text)
运行(“psshutdown.exe -c -d -accepteula -m mooshmoosh -t 5”)
;没有“ sleep ”,烦人的msgbox不会关闭
sleep (1000)
;关闭烦人的模态msgbox!
WinClose($ title)
; 1分钟延迟,保存cpu(?)
sleep (1 * 60 * 1000)
结束
(这是一个优化的版本-首次试用是占用大量CPU的资源)。
现在它位于系统托盘中,并且可以正常工作。
丢失消息的问题仍然存在。尽管我首先意识到它与python无关。