我試圖編寫一些python代碼來檢測Windows中的監視器更改事件;我使用pywin32,主要基於pywin32 example的代碼。看來PumpWaitingMessages
的位置有所不同;下面的代碼檢測到監視器變化(即OnDeviceChange
得到運行),但lp
參數爲0,所以我無法從它獲得任何有用的信息(即監視器標識符)。pywin32 win32gui.PumpWaitingMessages()placement
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)
但是,如果我從移動代碼的最末尾的while True
循環到__init__
方法的末尾,則lp
參數填充,我可以得到我想要的信息。
任何想法爲什麼放置while循環會有所作爲?
嗯;查看PumpWaitingMessages的文檔,它似乎適用於當前線程;我猜測這是問題出在哪裏。 – askvictor
我不知道問題是什麼,但是我確實看到[您正在全局註冊窗口類](https://blogs.msdn.microsoft.com/oldnewthing/20050418-59/?p=35873),這可能不是你想要做的。您也可能想要創建窗口消息 - 僅通過將'HWND_MESSAGE'作爲父窗口參數傳遞給'CreateWindow()',但我不確定是否會使您的窗口不適用於設備通知。 – andlabs
我看到'Foo'擴展了'QObject'。你是否也在使用_PyQt_?如果是,由於_Qt_有它自己的窗口處理機制,可以將它與純_WinAPI_混合嗎? – CristiFati