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()