C# WinForm调用Shell_NotifyIcon的示例代码
1. 引言
WinForm是C#开发中常用的桌面应用程序开发框架,它提供了一套完整的GUI组件库和事件处理机制。其中,Shell_NotifyIcon函数用于在系统托盘中显示图标和弹出菜单。本文将介绍如何在C# WinForm中调用Shell_NotifyIcon函数,并提供示例代码及说明。
2. 调用Shell_NotifyIcon函数的前提
在调用Shell_NotifyIcon函数之前,我们需要先添加Windows API函数声明(DllImport)以及一些常量的定义。这些声明和定义通常放在Win32 API函数定义的类中。下面是一个示例的声明和定义代码:
2.1 引入命名空间和常量定义
```csharp
using System;
using System.Runtime.InteropServices;
public class Win32API
{
// 其他常量定义...
public const int NIF_MESSAGE = 0x00000001;
public const int NIF_ICON = 0x00000002;
public const int NIF_TIP = 0x00000004;
public const int WM_MOUSEMOVE = 0x0200;
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
public const int WM_RBUTTONDOWN = 0x0204;
public const int WM_RBUTTONUP = 0x0205;
}
```
在上述代码中,我们使用了System.Runtime.InteropServices命名空间来引入Windows API函数声明所需的特性。
2.2 添加Shell_NotifyIcon函数声明
```csharp
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern bool Shell_NotifyIcon(int dwMessage, [In] ref NOTIFYICONDATA pnid);
```
在上述代码中,我们使用了DllImport特性来声明Shell_NotifyIcon函数。参数说明请参考Windows API文档。
3. 创建WinForm并调用Shell_NotifyIcon函数
下面是一个示例的WinForm类定义代码,其中包含了调用Shell_NotifyIcon函数的一个简单示例:
3.1 添加WinForm类定义
```csharp
public partial class MainForm : Form
{
private NOTIFYICONDATA notifyIconData;
public MainForm()
{
InitializeComponent();
InitializeNotifyIcon();
}
private void InitializeNotifyIcon()
{
notifyIconData = new NOTIFYICONDATA();
notifyIconData.cbSize = (uint)Marshal.SizeOf(notifyIconData);
notifyIconData.uFlags = Win32API.NIF_ICON | Win32API.NIF_MESSAGE | Win32API.NIF_TIP;
notifyIconData.hWnd = this.Handle;
notifyIconData.uID = 0x100;
notifyIconData.uCallbackMessage = Win32API.WM_MOUSEMOVE;
notifyIconData.hIcon = Properties.Resources.Icon.ToHicon();
notifyIconData.szTip = "C# WinForm Shell_NotifyIcon 示例";
Win32API.Shell_NotifyIcon(Win32API.NIM_ADD, ref notifyIconData);
}
// 其他事件处理函数...
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == Win32API.WM_MOUSEMOVE)
{
// 处理鼠标移动事件
}
else if (m.Msg == Win32API.WM_LBUTTONDOWN)
{
// 处理鼠标左键按下事件
}
else if (m.Msg == Win32API.WM_RBUTTONDOWN)
{
// 处理鼠标右键按下事件
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
Win32API.Shell_NotifyIcon(Win32API.NIM_DELETE, ref notifyIconData);
}
}
```
在上述代码中,我们创建了一个MainForm类并继承自Form类。在构造函数中,我们调用了InitializeNotifyIcon方法来初始化notifyIconData和注册系统托盘图标。在WndProc方法中,我们处理了鼠标移动、左键按下和右键按下事件(可根据需要进行扩展)。
3.2 创建WinForm实例并运行
在Main方法中,我们创建了MainForm实例并运行应用程序:
```csharp
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
```
在上述代码中,我们使用Application类的静态方法来启动应用程序,并将MainForm实例作为参数传入。
4. 总结
本文介绍了在C# WinForm中调用Shell_NotifyIcon函数的示例代码及说明。在实际开发中,我们可以根据具体需求对WinForm进行扩展,以实现更加丰富的系统托盘功能。如需了解更多关于Shell_NotifyIcon函数的详细信息,请参考Windows API文档。希望本文能对您有所帮助!