欢迎访问宙启技术站
智能推送

python编程中如何利用win32gui实现窗口的任务栏图标功能

发布时间:2024-01-18 03:42:32

在Python中可以使用win32gui模块来操作 Windows 窗口,并通过设置窗口的托盘图标实现任务栏图标的功能。下面是一个简单的使用例子:

import win32gui
import win32con
import win32api
import sys
import os

def show_window(hwnd, _):
    if win32gui.IsIconic(hwnd):
        win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
    else:
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)

    win32gui.UpdateWindow(hwnd)
    win32gui.SetForegroundWindow(hwnd)

def exit_application(hwnd, _):
    win32gui.PostQuitMessage(0)

def create_menu():
    menu = win32gui.CreatePopupMenu()
    win32gui.AppendMenu(menu, win32con.MF_STRING, 1, "显示窗口")
    win32gui.AppendMenu(menu, win32con.MF_STRING, 2, "退出程序")

    return menu

def tray_icon():
    hwnd = win32gui.GetForegroundWindow()
    hinst = win32api.GetModuleHandle(sys.argv[0])
    icon_path = os.path.abspath(os.path.join(sys.argv[0], "..\\icon.ico"))

    className = "MyWindowClass"
    wc = win32gui.WNDCLASS()
    wc.hInstance = hinst
    wc.lpszClassName = className
    wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW
    wc.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW)
    wc.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH)
    wc.lpfnWndProc = {}
    wc.cbWndExtra = win32con.CBWNDEXTRA

    icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
    hicon = win32gui.LoadImage(hinst, icon_path, win32con.IMAGE_ICON, 0, 0, icon_flags)

    wc.hIcon = hicon

    try:
        classAtom = win32gui.RegisterClass(wc)
    except win32gui.error as err:
        pass

    style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
    hwnd = win32gui.CreateWindow(wc.lpszClassName,
                                 "Taskbar Demo",
                                 style,
                                 0,
                                 0,
                                 win32con.CW_USEDEFAULT,
                                 win32con.CW_USEDEFAULT,
                                 0,
                                 0,
                                 hinst,
                                 None)
    nid = (hwnd, 0, win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP, win32con.WM_USER + 20, hicon, "Tooltip")
    win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid)

    win32gui.UpdateWindow(hwnd)

    win32gui.ShowWindow(hwnd, win32con.SW_HIDE)

    menu = create_menu()

    while True:
        try:
            message = win32gui.GetMessage(hwnd, 0, 0)
            win32gui.TranslateMessage(message)
            win32gui.DispatchMessage(message)
        except Exception as e:
            break

def get_window_handler(window_name):
    hwnd = win32gui.FindWindow(None, window_name)
    if not hwnd:
        print(f"Window '{window_name}' not found!")
        sys.exit()

    return hwnd

if __name__ == "__main__":
    hwnd = get_window_handler("My Window")
    win32gui.ShowWindow(hwnd, win32con.SW_HIDE)

    hinst = win32api.GetModuleHandle(None)
    win32gui.SetWindowsHookEx(win32con.WH_SHELL, show_window, hinst, hwnd)
    win32gui.MoveWindow(hwnd, 0, 0, 320, 240, 1)

    win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_TOOLWINDOW)
    
    tray_icon()

上述代码中,定义了一系列函数来实现任务栏图标的功能。其中:

- show_window函数用于恢复或显示窗口,根据窗口的当前状态来使用win32gui.ShowWindow函数进行操作。

- exit_application函数用于退出程序,使用win32gui.PostQuitMessage函数发送退出消息。

- create_menu函数创建右键菜单,并返回菜单的句柄。

- tray_icon函数创建窗口,并设置任务栏图标。在函数中使用win32gui.CreatePopupMenu创建右键菜单,并通过win32gui.AppendMenu添加菜单项。然后将窗口的消息循环置于while循环中,以便处理消息。

- get_window_handler函数用于获取窗口的句柄,通过win32gui.FindWindow函数根据窗口标题来查找窗口句柄。

在实际使用中,可以根据自己的需求修改代码。比如,设置一个特殊的标题来标识窗口,并在代码中使用相同的标题来获取窗口句柄。代码中使用的托盘图标采用了ICO格式的图片,可以替换为自己的图标。另外,还可以根据具体需求,在右键菜单的回调函数中执行相应操作。

在运行代码之后,会创建一个隐藏的窗口,并在任务栏上显示相应的图标。单击图标,会弹出右键菜单,可以选择显示窗口或退出程序的操作。