【问题标题】:how to hook to events / messages in windows using python如何使用python挂钩到Windows中的事件/消息
【发布时间】:2010-10-16 05:17: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) 有没有其他方法可以拦截待机进程?

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

谢谢大家:-)

【问题讨论】:

    标签: python windows wmi power-management


    【解决方案1】:

    我发现了一个丑陋的解决方法: 我编写了一个AutoIt 脚本,它检测 Excel 的错误消息框,将其关闭,然后运行一个 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 无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 2011-12-25
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      相关资源
      最近更新 更多