import win32con,win32gui class MyWindow(): def __init__(self): #注册一个窗口类 wc = win32gui.WNDCLASS() wc.lpszClassName = ‘MyWindow‘ wc.hbrBackground = win32con.COLOR_BTNFACE+1 #这里颜色用法有点特殊,必须+1才能得到正确的颜色 wc.lpfnWndProc = self.wndProc #可以用一个函数,也可以用一个字典 class_atom=win32gui.RegisterClass(wc) #创建窗口 self.hwnd = win32gui.CreateWindow( class_atom, u‘窗口标题‘, win32con.WS_OVERLAPPEDWINDOW, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0,0, 0, None) #显示窗口 win32gui.ShowWindow(self.hwnd, win32con.SW_SHOWNORMAL) #消息处理 def wndProc(self, hwnd, msg, wParam, lParam): if msg == win32con.WM_CREATE: print ‘message: WM_CREATE‘ if msg == win32con.WM_SIZE: print ‘message: WM_SIZE‘ if msg == win32con.WM_PAINT: print ‘message: WM_PAINT‘ if msg == win32con.WM_CLOSE: print ‘message: WM_CLOSE‘ if msg == win32con.WM_DESTROY: print ‘message: WM_DESTROY‘ win32gui.PostQuitMessage(0) return win32gui.DefWindowProc(hwnd, msg, wParam, lParam) mw = MyWindow() win32gui.PumpMessages()
Python和上面的C基本上是一样的,只有以下细微区别:
1. win32gui.PumpMessages()
这里win32gui.PumpMessages()实际上取代了下面的C代码
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
2. WNDCLASS.lpfnWndProc
lpfnWndProc既可以像C那样接受一个函数地址,也可以接受一个dict对象,用于映射具体的消息和针对的函数
wc.lpfnWndProc = { win32con.WM_CREATE: self.OnCreate, win32con.WM_SIZE: self.OnSize, win32con.WM_PAINT: self.OnPaint, win32con.WM_CLOSE: self.OnClose, win32con.WM_DESTROY: self.OnDistroy, }
def OnDestroy(self, hwnd, msg, wparam, lparam): print ‘message: WM_DESTROY‘ PostQuitMessage(0) def OnSize(self, hwnd, msg, wparam, lparam): print ‘message: WM_SIZE‘ def OnPaint(self, hwnd, msg, wparam, lparam): print ‘message: WM_PAINT‘
大概是pywin32在这里做了智能识别吧,分别对函数和字典做不同的处理
pywin32的文档不太全,好在C:\Python27\Lib\site-packages\win32\Demos中有很多示例代码