Python浮窗是一種在Windows操作系統中常用的用戶界面組件,它可以在桌面上顯示各種彈出式的工具窗口。
一、浮窗介紹
浮窗是Windows系統中的一種圖形用戶界面元素,通常為子窗口形式,不具有標題欄,不可最大化、最小化或移動。一般用於顯示一些零散信息、工具界面等。
Python通過Win32API來實現浮窗的創建與顯示,需要使用Python的win32gui、win32api、win32con等模塊進行操作。
二、創建浮窗
要創建一個浮窗,可以按照以下步驟操作:
- 導入Win32API相關模塊
- 定義浮窗過程
- 註冊窗口類
- 創建窗口
- 顯示窗口
第一步:導入模塊
import win32gui import win32api import win32con
第二步:定義浮窗過程
浮窗過程是指一個回調函數,在創建浮窗時需要指定回調函數,以響應窗口事件,如關閉、滑鼠點擊等。
def WndProc(hwnd, msg, wParam, lParam): if msg == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
第三步:註冊窗口類
窗口類包含了關於窗口的許多信息,包括窗口過程、背景顏色、游標形狀等。在創建窗口前需要先註冊窗口類。
wc = win32gui.WNDCLASS() wc.hInstance = hInstance wc.lpszClassName = className wc.lpfnWndProc = WndProc classAtom = win32gui.RegisterClass(wc)
第四步:創建窗口
創建窗口需要指定窗口類、窗口名稱、窗口風格、位置與大小等參數。
style = win32con.WS_POPUP | win32con.WS_VISIBLE exStyle = win32con.WS_EX_APPWINDOW | win32con.WS_EX_TOPMOST hwnd = win32gui.CreateWindowEx(exStyle, className, className, style, 0, 0, width, height, 0, 0, hInstance, None)
第五步:顯示窗口
在完成了創建窗口之後,需要將其顯示出來。
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL) win32gui.UpdateWindow(hwnd)
三、給浮窗添加控制項
浮窗可以添加各種控制項,比如文本框、按鈕、標籤等,使其具備更強的功能。
第一步:添加窗口消息響應
在浮窗過程中添加窗口消息響應,以便在控制項事件觸發時響應。
def WndProc(hwnd, msg, wParam, lParam): if msg == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return elif msg == win32con.WM_COMMAND: cmd = win32api.HIWORD(wParam) if cmd == win32con.BN_CLICKED: if lParam == buttonHandle: win32gui.MessageBox(hwnd, 'Hello World!', 'Message', win32con.MB_OK) return return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
第二步:添加按鈕
添加按鈕需要以下幾個步驟:
- 創建按鈕
- 設置按鈕尺寸和位置
- 設置按鈕屬性
buttonHandle = win32gui.CreateWindow( "BUTTON", "Click Me!", win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.BS_PUSHBUTTON, 50, 50, 100, 30, hwnd, 1000, hInstance, None)
四、實現浮窗拖拽
浮窗可以通過滑鼠拖拽的方式移動,為此需要在浮窗過程中處理WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP等消息,以實現拖拽效果。
def WndProc(hwnd, msg, wParam, lParam): global isDragging, mouseX, mouseY if msg == win32con.WM_LBUTTONDOWN: isDragging = True mouseX, mouseY = win32api.LOWORD(lParam), win32api.HIWORD(lParam) win32gui.SetCapture(hwnd) elif msg == win32con.WM_MOUSEMOVE: if isDragging: x, y = win32api.LOWORD(lParam), win32api.HIWORD(lParam) dx, dy = x - mouseX, y - mouseY left, top, right, bottom = win32gui.GetWindowRect(hwnd) win32gui.MoveWindow(hwnd, left + dx, top + dy, right - left, bottom - top, True) mouseX, mouseY = x, y elif msg == win32con.WM_LBUTTONUP: isDragging = False win32api.ReleaseCapture() return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
五、實現浮窗透明度設置
浮窗可以通過設置透明度,實現更加吸引人的界面效果。
第一步:導入相關模塊
import ctypes
第二步:定義窗口樣式
在創建窗口時,需要指定WS_EX_LAYERED樣式,以便後續設置透明度。
exStyle = win32con.WS_EX_LAYERED | win32con.WS_EX_TOPMOST hwnd = win32gui.CreateWindowEx(exStyle, className, className, style, 0, 0, width, height, 0, 0, hInstance, None)
第三步:設置透明度
通過win32gui.SetLayeredWindowAttributes函數設置窗口透明度。注意,alpha值在0~255之間,0表示完全透明,255表示完全不透明。
def setWindowTransparency(hwnd, alpha): style = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) if not style & win32con.WS_EX_LAYERED: win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, style | win32con.WS_EX_LAYERED) win32gui.SetLayeredWindowAttributes(hwnd, 0, alpha, win32con.LWA_ALPHA)
六、完整代碼
import win32gui import win32api import win32con import ctypes isDragging = False mouseX, mouseY = 0, 0 def setWindowTransparency(hwnd, alpha): style = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) if not style & win32con.WS_EX_LAYERED: win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, style | win32con.WS_EX_LAYERED) win32gui.SetLayeredWindowAttributes(hwnd, 0, alpha, win32con.LWA_ALPHA) def WndProc(hwnd, msg, wParam, lParam): global isDragging, mouseX, mouseY if msg == win32con.WM_LBUTTONDOWN: isDragging = True mouseX, mouseY = win32api.LOWORD(lParam), win32api.HIWORD(lParam) win32gui.SetCapture(hwnd) elif msg == win32con.WM_MOUSEMOVE: if isDragging: x, y = win32api.LOWORD(lParam), win32api.HIWORD(lParam) dx, dy = x - mouseX, y - mouseY left, top, right, bottom = win32gui.GetWindowRect(hwnd) win32gui.MoveWindow(hwnd, left + dx, top + dy, right - left, bottom - top, True) mouseX, mouseY = x, y elif msg == win32con.WM_LBUTTONUP: isDragging = False win32api.ReleaseCapture() elif msg == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return elif msg == win32con.WM_COMMAND: cmd = win32api.HIWORD(wParam) if cmd == win32con.BN_CLICKED: if lParam == buttonHandle: win32gui.MessageBox(hwnd, 'Hello World!', 'Message', win32con.MB_OK) return return win32gui.DefWindowProc(hwnd, msg, wParam, lParam) if __name__ == '__main__': # 創建應用程序實例 hInstance = win32api.GetModuleHandle(None) # 定義窗口類 className = 'MyWindowClass' wc = win32gui.WNDCLASS() wc.hInstance = hInstance wc.lpszClassName = className wc.lpfnWndProc = WndProc classAtom = win32gui.RegisterClass(wc) # 創建窗口 width, height = 300, 200 style = win32con.WS_POPUP | win32con.WS_VISIBLE exStyle = win32con.WS_EX_APPWINDOW | win32con.WS_EX_LAYERED | win32con.WS_EX_TOPMOST hwnd = win32gui.CreateWindowEx(exStyle, className, className, style, 0, 0, width, height, 0, 0, hInstance, None) # 添加按鈕 buttonHandle = win32gui.CreateWindow( "BUTTON", "Click Me!", win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.BS_PUSHBUTTON, 50, 50, 100, 30, hwnd, 1000, hInstance, None) # 顯示窗口 win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL) win32gui.UpdateWindow(hwnd) # 設置窗口透明度 setWindowTransparency(hwnd, 200) # 進入消息循環 win32gui.PumpMessages()
原創文章,作者:VOECQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/375486.html