在unity中实现隐藏窗口,显示系统托盘图标,右键菜单退出功能
需要导入Targets .NET 3.5的System.Windows.Forms
using UnityEngine;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
public class SystemTrayIcon : MonoBehaviour
{
private NotifyIcon notifyIcon;
private ContextMenuStrip contextMenu;
// 引入 Windows API 函数
[DllImport("user32.dll")]
private static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern System.IntPtr GetActiveWindow();
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
private const int SW_HIDE = 0;
void Awake()
{
// 隐藏窗口
System.IntPtr hWnd = GetActiveWindow();
ShowWindow(hWnd, SW_HIDE);
// 创建上下文菜单
contextMenu = new ContextMenuStrip();
ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("退出");
exitMenuItem.Click += ExitMenuItem_Click;
contextMenu.Items.Add(exitMenuItem);
// 创建系统托盘图标
notifyIcon = new NotifyIcon();
notifyIcon.Icon = new Icon(UnityEngine.Application.streamingAssetsPath + "/icon.ico"); // 替换为你的图标路径
notifyIcon.Text = "Unity 系统托盘图标";
notifyIcon.ContextMenuStrip = contextMenu;
notifyIcon.Visible = true;
notifyIcon.MouseDoubleClick += NotifyIcon_MouseDoubleClick;
}
private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// 双击图标时将 Unity 窗口置于前台
System.IntPtr hWnd = GetActiveWindow();
SetForegroundWindow(hWnd);
}
}
private void ExitMenuItem_Click(object sender, System.EventArgs e)
{
// 退出应用程序
notifyIcon.Visible = false;
notifyIcon.Dispose();
UnityEngine.Application.Quit();
}
void OnApplicationQuit()
{
// 在应用程序退出时释放资源
if (notifyIcon != null)
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
}
}
}