Windowsでモニター変更イベントを検出するためのPythonコードをいくつか記述しようとしています。私は主にpywin32 exampleのコードを中心にpywin32を使用しています。 PumpWaitingMessages
を配置すると違いがあるようです。下記のコードはモニターの変更を検出します(つまりOnDeviceChange
が実行されます)。lp
の引数は0なので、そこから有用な情報(モニターID)を取得することはできません。私は__init__
方法の最後に、コードの最後からwhile True
ループを移動した場合pywin32 win32gui.PumpWaitingMessages()配置
class Foo(QObject):
def OnDeviceChange(self, hwnd, msg, wp, lp):
info = win32gui_struct.UnpackDEV_BROADCAST(lp)
print("Device change notification:", wp, str(info)) #
return True
def __init__(self):
wc = win32gui.WNDCLASS()
wc.lpszClassName = 'test_devicenotify'
wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW
wc.hbrBackground = win32con.COLOR_WINDOW + 1
wc.lpfnWndProc = {win32con.WM_DEVICECHANGE: self.OnDeviceChange}
class_atom = win32gui.RegisterClass(wc)
hwnd = win32gui.CreateWindow(wc.lpszClassName,
'Waiting for Monitor Change',
# no need for it to be visible.
win32con.WS_CAPTION,
100, 100, 900, 900, 0, 0, 0, None)
filter = win32gui_struct.PackDEV_BROADCAST_DEVICEINTERFACE(
GUID_DEVINTERFACE_MONITOR)
hdev = win32gui.RegisterDeviceNotification(hwnd, filter,
win32con.DEVICE_NOTIFY_WINDOW_HANDLE)
f = Foo()
while True:
win32gui.PumpWaitingMessages()
time.sleep(0.01)
しかし、その後、lp
引数が移入され、そして私は、私が欲しい情報を得ることができます。
なぜwhileループの配置が違いになるのでしょうか?
うーん。 PumpWaitingMessagesのドキュメントを見ると、現在のスレッドで動作するようです。私はこれが問題がどこにあるのかと推測しています。 – askvictor
問題の内容はわかりませんが、[グローバルにウィンドウクラスを登録しています](https://blogs.msdn.microsoft.com/oldnewthing/20050418-59/?p=35873)、おそらくあなたがしたいことではありません。 'HWND_MESSAGE'を親ウィンドウのパラメータとして' CreateWindow() 'に渡すことでウィンドウをメッセージのみにしたいかもしれませんが、ウィンドウがデバイスの通知を受けないかどうかは分かりません。 – andlabs
'Foo'は' QObject'を拡張しています。 _PyQt_も使用していますか?はいの場合、_Qt_には独自のウィンドウ処理機構があるので、それをplain _WinAPI_と混在させても問題ありませんか? – CristiFati