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格式的图片,可以替换为自己的图标。另外,还可以根据具体需求,在右键菜单的回调函数中执行相应操作。
在运行代码之后,会创建一个隐藏的窗口,并在任务栏上显示相应的图标。单击图标,会弹出右键菜单,可以选择显示窗口或退出程序的操作。
