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-hant/n/375486.html
微信掃一掃
支付寶掃一掃