10

简而言之:

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

背景:

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

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

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

我有一个 sysinternals 实用程序,无论如何都会暂停系统。我想把它和闭盖事件挂钩!

长:

笔记本盖子关闭(富士通u810)启动待机程序[如何?]

然后系统向所有人发送 WM_POWERBROADCAST: PBT_APMQUERYSUSPEND(我可以使用 跟踪他们SPYXX.EXE

每个程序都回答“真”,直到excel回答“假”,整个过程就停止了。

我的问题:

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)还有其他方法可以拦截待机进程吗?

在一个完美的世界里,我会设置盖子关闭事件来运行我选择的命令。在一个完美的世界里,合盖是一个记录在案的事件。

谢谢你们 :-)

4

1 回答 1

2

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

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

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

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

于 2009-04-02T00:47:07.310 回答