C# WinForm调用Shell_NotifyIcon的示例代码

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文档。希望本文能对您有所帮助!

后端开发标签