如何在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模块创建一个窗口,并在任务栏中显示自定义的图标,并添加一些交互功能。可以根据实际需求,进一步扩展和修改代码,以实现更复杂的功能。
