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/n/375486.html
微信扫一扫
支付宝扫一扫