桌面右下角弹出消息窗体,不影响程序聚焦
在Windows操作系统中,桌面右下角的消息窗体通常被称为气泡通知或托盘通知,它是一种非侵入式的用户交互方式,允许程序在不中断用户当前工作的情况下传递信息。这种功能在很多应用中都能见到,比如系统更新提示、邮件提醒等。在C#编程环境中,可以通过调用WinAPI(Windows应用程序接口)来实现这种效果。本文将详细介绍如何使用C#结合WinAPI创建一个在桌面右下角弹出的消息窗体,并且确保这个窗体不会影响到当前活动的程序聚焦。 我们需要了解WinAPI中的关键函数。`Shell_NotifyIcon`是实现托盘通知的主要函数,它允许我们向任务栏通知区域添加、修改或删除图标,并显示消息。这个函数来自`shell32.dll`库,所以我们需要使用`DllImport`特性导入它: ```csharp using System.Runtime.InteropServices; [DllImport("shell32.dll", SetLastError = true)] static extern bool Shell_NotifyIcon(NotifyMessage msg, NotifyData data); ``` 接下来,定义两个结构体,`NotifyData`用于封装通知信息,`NotifyMessage`定义消息类型: ```csharp [StructLayout(LayoutKind.Sequential)] struct NotifyData { public uint cbSize; public uint uID; public uint uFlags; public uint uTimeout; public uint uVersion; [MarshalAs(UnmanagedType.LPStr)] public string szTip; public System.Drawing.Icon hIcon; [MarshalAs(UnmanagedType.LPTStr)] public string szInfo; public uint uInfoFlags; [MarshalAs(UnmanagedType.LPTStr)] public string szTitle; public System.IntPtr hBalloonIcon; } [Flags] enum NotifyMessage : uint { NIM_ADD = 0x00000000, NIM_MODIFY = 0x00000001, NIM_DELETE = 0x00000002, NIM_SETVERSION = 0x00000004 } ``` 然后,我们需要创建一个类来管理托盘通知,包括设置图标、显示消息和清理资源: ```csharp class TrayNotifier { private uint notifyId; private NotifyData notifyData; private const uint NOTIFY_ICON_VERSION = 4; public TrayNotifier(System.Drawing.Icon icon, string tooltip) { notifyData.cbSize = (uint)Marshal.SizeOf(notifyData); notifyData.uID = Guid.NewGuid().GetHashCode(); notifyData.uVersion = NOTIFY_ICON_VERSION; notifyData.hIcon = icon.Handle; notifyData.szTip = tooltip; } public void ShowMessage(string title, string message, NotifyFlags flags) { notifyData.szTitle = title; notifyData.szInfo = message; notifyData.uInfoFlags = (uint)flags; Shell_NotifyIcon(NotifyMessage.NIM_MODIFY, notifyData); } public void Dispose() { notifyData.uFlags = (uint)NotifyFlags.NIF_STATE; notifyData.uState = (uint)NotifyState.NIS_HIDDEN; Shell_NotifyIcon(NotifyMessage.NIM_MODIFY, notifyData); Shell_NotifyIcon(NotifyMessage.NIM_DELETE, notifyData); } } ``` `NotifyFlags`和`NotifyState`是枚举类型,分别表示通知的样式和状态,例如`NIF_INFO`表示显示信息气泡,`NIF_ICON`表示显示图标,`NIS_HIDDEN`表示隐藏图标等。 在实际使用时,你可以在适当的时候创建一个`TrayNotifier`实例,设置图标和提示文本,然后调用`ShowMessage`方法显示消息。当不再需要通知时,调用`Dispose`方法移除图标。 例如: ```csharp var icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath); var notifier = new TrayNotifier(icon, "我的程序"); notifier.ShowMessage("消息标题", "这是需要告知用户的详细信息", NotifyFlags.NIF_INFO | NotifyFlags.NIF_MESSAGE | NotifyFlags.NIF_ICON); ``` 在上述代码中,`ExtractAssociatedIcon`是从应用程序的可执行文件中提取关联的图标,然后创建一个`TrayNotifier`对象,设置图标和提示文本。显示一个带有标题和信息的气泡通知。 通过C#调用WinAPI,我们可以创建出在桌面右下角弹出的消息窗体,这种窗体不会影响到用户正在使用的其他程序,提供了一种高效而优雅的通知方式。需要注意的是,正确处理WinAPI函数的输入参数和返回值,以及在使用完毕后释放资源,这些都是编写稳定、健壮代码的关键。
- 1
- 坚_持2013-03-27呵呵 还可以 不过不是我想要的
- u0111389822013-11-29呵呵 还可以 不过也不是我想要的
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2024下半年,CISSP官方10道练习题
- JD-Core是一个用JAVA编写的JAVA反编译器 .zip
- 时间复杂度与数据结构:算法效率的双重奏
- QT 简易项目 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现
- YOLOv3网络架构深度解析:关键特性与代码实现
- ACOUSTICECHO CANCELLATION WITH THE DUAL-SIGNAL TRANSFORMATION LSTM NETWORK
- 深入解析:动态数据结构与静态数据结构的差异
- YOLOv2:在YOLOv1基础上的飞跃
- imgview图片浏览工具v1.0
- Toony Colors Pro 2 2.2.5的资源