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

如何在Python中利用win32gui实现窗口的任务栏图标显示

发布时间:2024-01-02 21:56:32

win32gui是Python中的一个模块,可以用来操作Windows系统图形界面的一些功能,比如窗口的创建、控制、以及系统托盘图标等。利用win32gui可以实现在任务栏中显示自定义的图标,并且可以添加一些交互功能。下面是一个使用win32gui实现窗口的任务栏图标显示的例子。

首先,我们需要安装pywin32模块。可以使用pip命令进行安装:

pip install pywin32

安装完成后,我们可以开始编写代码。以下是一个简单的例子,实现了窗口的任务栏图标显示,并在右键菜单中添加了一些功能。

import win32con
import win32gui
import win32api

# 窗口类
class MyWindow:
    def __init__(self):
        # 注册窗口类
        wc = win32gui.WNDCLASS()
        wc.hInstance = win32api.GetModuleHandle(None)
        wc.lpszClassName = 'MyWindowClass'
        wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW
        wc.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW)
        wc.hbrBackground = win32con.COLOR_WINDOW
        wc.lpfnWndProc = self.WndProc
        class_atom = win32gui.RegisterClass(wc)

        # 创建窗口
        self.hwnd = win32gui.CreateWindow(
            class_atom,
            'MyWindow',
            win32con.WS_OVERLAPPEDWINDOW,
            win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
            win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
            0, 0, wc.hInstance, None
        )

        # 创建任务栏图标
        self.hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
        self.hmenu = win32gui.CreatePopupMenu()
        win32gui.InsertMenu(self.hmenu, 0, win32con.MF_BYPOSITION, 1, '功能1')
        win32gui.InsertMenu(self.hmenu, 1, win32con.MF_BYPOSITION, 2, '功能2')
        win32gui.InsertMenu(self.hmenu, 2, win32con.MF_BYPOSITION, 3, '功能3')
        self.hicon_menu = (self.hicon, 0, win32con.WM_USER + 20, self.hmenu)
        win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, self.hicon_menu)

    def WndProc(self, hwnd, msg, wparam, lparam):
        if msg == win32con.WM_COMMAND:
            if wparam == 1:
                print('执行功能1')
            elif wparam == 2:
                print('执行功能2')
            elif wparam == 3:
                print('执行功能3')
        elif msg == win32con.WM_SYSCOMMAND:
            if wparam == win32con.SC_MINIMIZE:
                # 最小化到任务栏
                win32gui.ShowWindow(self.hwnd, win32con.SW_HIDE)
                return 1
            elif wparam == win32con.SC_CLOSE:
                # 关闭窗口
                win32gui.DestroyWindow(self.hwnd)
                return 1
        elif msg == win32con.WM_DESTROY:
            # 销毁图标
            win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, self.hicon_menu)
            # 退出程序
            win32gui.PostQuitMessage(0)
            return 1
        return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)

    def run(self):
        # 显示窗口
        win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
        # 消息循环
        win32gui.PumpMessages()


if __name__ == '__main__':
    window = MyWindow()
    window.run()

在这个例子中,我们定义了一个窗口类MyWindow,其中实现了窗口类的初始化、窗口消息处理函数WndProc、窗口的创建和任务栏图标的显示等功能。在WndProc函数中,我们通过判断消息的类型来执行相应的操作,比如点击右键菜单的功能按钮时打印对应的功能信息。在最后的run函数中,我们首先显示窗口,然后启动消息循环,等待用户的交互操作。

需要注意的是,在消息循环中,我们使用了win32gui.PumpMessages()来等待消息的到来,这会导致程序在循环中一直等待消息,而不能执行后续代码。所以,在消息处理完成后,我们需要使用win32gui.PostQuitMessage(0)来退出消息循环,并返回到run函数的后续代码。

通过这个例子,我们可以实现在Python中利用win32gui模块创建一个窗口,并在任务栏中显示自定义的图标,并添加一些交互功能。可以根据实际需求,进一步扩展和修改代码,以实现更复杂的功能。