WM_USER 与 WM_APP .

本文详细解析了WM_USER和WM_APP消息类型的不同含义及其在消息传递过程中的应用策略,强调了遵循规则的重要性以避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define WM_GET (WM_USER+112) 和 #define WM_GET (WM_APP+112)除了值不同外,有区别吗?
(1)WM_USER through 0x7FFF Integer messages for use by private window classes. WM_APP through 0xBFFF Messages available for use by applications.
(2)默认规则是以WM_USER+X(WM_USER--0x7fff)用于窗口级的消息,WM_APP+X(WM_APP--0xbfff)用于进程级的消息.  
(3)我的理解:第一种定义用于进程内消息,第二种定义用于进程间消息
(4)约定俗成的一种规则。
 WM_USER through 0x7FFF: 仅在自己预定义的窗口内部使用;
 WM_APP through 0xBFFF: 在应用程序的其他地方均可使用
例一:
如果程序的所有窗口和所有控件完全由你一个人实现,你完全可以不遵守这一规则。
但若有其他人写的代码或加载了外来的控件,如果你不遵守这一规则,发生冲突的概率会明显加大,可能会出现意想不到的结果。
例二:
这样的:我的COM里需要定义一个通知消息,来通知应用程序为它填充缓冲,这个COM是一个进程内的COM,当我#define   WM_GET   (WM_USER+112)   时,通过测试30次,可能要失败1次,用#define   WM_GET   (WM_APP+112)时,30次全成功,但现在不敢肯定是它引起的,有可能其他地方还会有影响。
import tkinter as tk from tkinter import Menu import threading import win32api import pythoncom from win32gui import NIF_TIP, NIF_MESSAGE, NIF_ICON, LoadImage, Shell_NotifyIcon, NIM_ADD, NIM_DELETE,GetCursorPos from win32con import LR_LOADFROMFILE, WM_USER, IMAGE_ICON, WM_LBUTTONUP, LR_DEFAULTSIZE,WM_RBUTTONUP import os WM_TRAYICON = WM_USER + 1 class SysTrayIcon: def __init__(self, hwnd, icon_path: str = 'app.ico', title="Tkinter App"): self.hwnd =hwnd # 主窗口引用 self.icon_path = os.path.abspath(icon_path) self.title = title self.message_map = {WM_LBUTTONUP: self.on_left_click} # 左键单击事件 self.message_map.update({WM_RBUTTONUP: self.show_menu}) self.create_tray_icon() def create_tray_icon(self): # 创建托盘图标 self.icon_flags = NIF_ICON | NIF_MESSAGE | NIF_TIP self.hIcon = LoadImage(None, self.icon_path, IMAGE_ICON, 0, 0, LR_LOADFROMFILE) self.nid = ( self.hwnd, 0, self.icon_flags, WM_TRAYICON, self.hIcon, "双击显示窗口" ) # print(self.nid) Shell_NotifyIcon(NIM_ADD, self.nid) def on_left_click(self, hwnd, msg, wparam, lparam): self.hwnd.deiconify() # 恢复窗口显示 self.remove_icon() # 移除托盘图标 # 添加托盘菜单功能(扩展SysTrayIcon类) def show_menu(self, hwnd, msg, wparam, lparam): if msg == WM_RBUTTONUP: # 右键单击 pos = GetCursorPos() self.tray_menu.tk_popup(pos[0], pos[1]) # 在鼠标位置弹出菜单 def remove_icon(self): Shell_NotifyIcon(NIM_DELETE, self.nid) class MainWindow(tk.Tk): def __init__(self): super().__init__() self.title("系统托盘示例") self.geometry("300x200") self.protocol("WM_DELETE_WINDOW", self.on_close) # 覆盖关闭按钮行为 self.bind("<Unmap>", self.minimize_to_tray) # 绑定最小化事件 # 创建托盘菜单 self.tray_menu = Menu(self, tearoff=0) self.tray_menu.add_command(label="恢复窗口", command=self.restore_window) self.tray_menu.add_command(label="退出", command=self.destroy) def minimize_to_tray(self, event): if event.widget == self: # 确保是主窗口最小化 self.withdraw() # 隐藏窗口 SysTrayIcon(self.winfo_id(), "app.ico") # 创建托盘图标 def on_close(self): self.destroy() # 实际关闭程序 def restore_window(self): self.deiconify() # 恢复窗口显示 if __name__ == "__main__": app = MainWindow() app.mainloop()
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值