文号
t78523
阅读
6697
回复
4
收藏
2
Python建立Win32窗口
2016/01/11
IP:北京
看起来也不算复杂(更新:支持64位)
from ctypes import *
from ctypes.wintypes import *
  
WNDPROC = WINFUNCTYPE(LPARAM, HWND, UINT, WPARAM, LPARAM)
  
class WNDCLASSEX(Structure):  
    _fields_ = [("cbSize", UINT),  
                ("style", UINT),  
                ("lpfnWndProc", WNDPROC),  
                ("cbClsExtra", c_int),  
                ("cbWndExtra", c_int),  
                ("hInstance", HANDLE),  
                ("hIcon", HANDLE),  
                ("hCursor", HANDLE),  
                ("hBrush", HANDLE),  
                ("lpszMenuName", LPCWSTR),  
                ("lpszClassName", LPCWSTR),  
                ("hIconSm", HANDLE)]
  
WS_OVERLAPPEDWINDOW = 0xCF0000
SW_SHOW = 5
CS_HREDRAW = 2
CS_VREDRAW = 1
CW_USEDEFAULT = 0x80000000
WM_DESTROY = 2
WHITE_BRUSH = 0
IDI_APPLICATION = 32512
IDC_ARROW = 32512
  
# program starts here
  
def PyWndProc(hwnd, message, wparam, lparam):
    if message == WM_DESTROY:
        windll.user32.PostQuitMessage(0)
        return 0
    else:
        return windll.user32.DefWindowProcW(HWND(hwnd), message, WPARAM(wparam), LPARAM(lparam))
          
WndProc = WNDPROC(PyWndProc)
  
hInst = windll.kernel32.GetModuleHandleW(None)
  
wndclass = WNDCLASSEX()
wndclass.cbSize = sizeof(WNDCLASSEX)
wndclass.style = CS_HREDRAW | CS_VREDRAW
wndclass.lpfnWndProc = WndProc
wndclass.cbClsExtra = 0
wndclass.cbWndExtra = 0
wndclass.hInstance = hInst
wndclass.hIcon = windll.user32.LoadIconW(None, IDI_APPLICATION)
wndclass.hCursor = windll.user32.LoadCursorW(None, IDC_ARROW)
wndclass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)
wndclass.lpszMenuName = None
wndclass.lpszClassName = u'MyWndClass'
wndclass.hIconSm = windll.user32.LoadIconW(None, IDI_APPLICATION)
  
windll.user32.RegisterClassExW(byref(wndclass))
  
hwnd = windll.user32.CreateWindowExW(
    0, u'MyWndClass', u'标题', WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    None, None, HANDLE(hInst), None)
  
windll.user32.ShowWindow(HWND(hwnd), SW_SHOW)
windll.user32.UpdateWindow(HWND(hwnd))
  
msg = MSG()
while windll.user32.GetMessageW(byref(msg), None, 0, 0):
    windll.user32.TranslateMessage(byref(msg))
    windll.user32.DispatchMessageW(byref(msg))
[ 修改于10年11个月前 - 2016/01/11 17:04:54 ]
acmilan作者
10年11个月前IP:北京
803700
1楼
基于python 3.5
引用
评论
acmilan作者
10年11个月前修改于 10年11个月前IP:天津
803708
2楼
Python传递参数默认总是认为是c_int。。。遇到系统传来的64位数据(如句柄、指针等),传入其它函数时最好用LPARAM(c_longlong)或LPVOID/HANDLE/HWND(c_void_p)等包装一下,不然超出32位界限容易报错。。。
引用
评论
acmilan作者
10年11个月前IP:天津
803771
3楼
不要再用python2了,投入python3的怀抱,远离编码问题。。。打包为exe可以用cxfreeze或pyinstaller。。。
引用
评论
10年9个月前IP:天津
813793
4楼
好蛋疼,为何不用现成的库
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的