首页 > 编程知识 正文

Python浮窗用法介绍

时间:2023-11-19 14:38:52 阅读:292630 作者:ZADQ

Python浮窗是一种在Windows操作系统中常用的用户界面组件,它可以在桌面上显示各种弹出式的工具窗口。

一、浮窗介绍

浮窗是Windows系统中的一种图形用户界面元素,通常为子窗口形式,不具有标题栏,不可最大化、最小化或移动。一般用于显示一些零散信息、工具界面等。

Python通过Win32API来实现浮窗的创建与显示,需要使用Python的win32gui、win32api、win32con等模块进行操作。

二、创建浮窗

要创建一个浮窗,可以按照以下步骤操作:

  1. 导入Win32API相关模块
  2. 定义浮窗过程
  3. 注册窗口类
  4. 创建窗口
  5. 显示窗口

第一步:导入模块

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)

第二步:添加按钮

添加按钮需要以下几个步骤:

  1. 创建按钮
  2. 设置按钮尺寸和位置
  3. 设置按钮属性
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()

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。