как подключить к событиям / сообщениям в Windows, используя Python - PullRequest
9 голосов
/ 29 марта 2009

короче:

Я хочу перехватить сообщения о приостановке / ожидании на моем ноутбуке, но моя программа не получает все соответствующие сообщения.

фон:

В ms-excel для Windows XP / 2k есть ошибка, которая не позволяет системе приостанавливаться, если файл открывается на сетевом / 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) Есть ли другой способ перехватить резервный процесс?

в мире префектов я бы установил событие закрытия крышки, чтобы запустить выбранную мной команду. в идеальном мире закрытие крышки - задокументированное событие.

спасибо всем: -)

1 Ответ

2 голосов
/ 02 апреля 2009

Я нашел уродливый обходной путь: Я написал сценарий AutoIt , который обнаруживает сообщение об ошибке Excel, закрывает его и запускает утилиту sysinternals, которая заставляет компьютер переходить в режим ожидания.

Opt("WinWaitDelay",400)
; -- exact text match, to save LOTS of cup cycles!
Opt("WinTitleMatchMode",3)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
; Opt("WinSearchChildren",1)
dim $title = "Microsoft Excel"
dim $text = "Windows cannot go on standby because Microsoft Office documents or application components are being accessed from the network. You must close the open documents or exit the applications before you can put the computer on standby."
While True
     ; wait for excel's error msg
     WinWait($title, $text)
     Run("psshutdown.exe -c -d -accepteula -m mooshmoosh -t 5")
     ; the annoying msgbox doesn't close without the 'sleep'
     Sleep(1000)
     ; close the annoying modal msgbox!
     WinClose($title)
     ;1 minute delay, save cpu (?)
     Sleep(1*60*1000)
WEnd

(это оптимизированная версия - первые испытания были загружены процессором).
теперь он сидит в системном трее и просто работает.

Вопрос о потерянных сообщениях все еще открыт. хотя я понял, что это никак не связано с питоном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...