简而言之:

我想在笔记本电脑上拦截挂起/待机消息,但是我的程序未收到所有相关消息。

背景:

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无关。

09-04 04:20
查看更多