C# 托管窗口和单例窗口实现 NotifyIcon 与 user32.dll

8 篇文章 0 订阅

注:案例是用WPF写的,在winfrom 和 uwp 中应该也可以实现。

1.效果截图:

2.新建一个WPF工程窗口。

3.双击MainWindow.xaml,设计窗口。

使用 ResizeMode="CanMinimize" 属性值,禁止窗口最大化,这里可以不禁用,看具体的需求。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        ResizeMode="CanMinimize" 
        Title="MainWindow" Height="200" Width="750">
    <Grid>
        <Label Content="My Managed window" FontWeight="Bold" Foreground="Blue" FontSize="20px"  Margin="250,60"></Label>
    </Grid>
</Window>

4.给项目找个好看的图标 .ico 和 .png 格式。

①新建资源文件,将上面两张图分别添加至资源文件当中。

②分别更改图标资源属性。

③更改窗口运行时标题栏和任务栏上的图标;打开窗体属性,选择 .ico 图标。

④更改程序exe图标,选择资源文件中的图标。

⑤添加托管图标 并且 在图标上添加 双击事件,打开事件和 退出事件;另外添加单例窗口;代码如下:

注:MainWindow.xaml.cs 中主要实现托管图标,App.xaml.cs 中主要实现单例窗口。

MainWindow.xaml.cs 代码:

using System;
using System.IO;
using System.Windows;
using System.Windows.Forms;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {

        private NotifyIcon notifyIcon = null;

        public MainWindow()
        {
            InitializeComponent();

            //窗口显示屏幕中间
            WindowStartupLocation = WindowStartupLocation.CenterScreen;
           
            //重写关闭事件
            Closing += Window_Closing;

            //托管图标
            notifyIcon = new NotifyIcon
            {
                BalloonTipText = "My Managed Window",
                Text = "My Managed Window",
                Visible = true
            };

            Stream iconStream = System.Windows.Application.GetResourceStream(new Uri("pack://application:,,,/WpfApplication1;component/Resources/Managed.ico")).Stream;
            notifyIcon.Icon = new System.Drawing.Icon(iconStream);
            notifyIcon.DoubleClick += NotifyIcon_DoubleClick;

            System.Windows.Forms.MenuItem open = new System.Windows.Forms.MenuItem("打开");
            open.Click += Open_Click;
            System.Windows.Forms.MenuItem close = new System.Windows.Forms.MenuItem("退出");
            close.Click += Close_Click;
            System.Windows.Forms.MenuItem[] m = new System.Windows.Forms.MenuItem[] { open, close };
            notifyIcon.ContextMenu = new System.Windows.Forms.ContextMenu(m);
        }

        /// <summary>
        /// 托管图标,打开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Open_Click(object sender, EventArgs e)
        {
            if (WindowState == WindowState.Minimized)
            {
                Show();
                WindowState = WindowState.Normal;
                ShowInTaskbar = true;
            }
            else
            {
                IntPtr hWnd = App.FindWindow(null, "My Managed Window");
                App.ShowWindow(hWnd, 9);
            }
        }

        /// <summary>
        /// 托管图标,退出事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Close_Click(object sender, EventArgs e)
        {
            if (System.Windows.MessageBox.Show("是否确认退出?", "My Managed Window", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes)
            {
                Close();
                notifyIcon.Dispose();
                Environment.Exit(0);
            }
        }

        /// <summary>
        /// 托管图标,双击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void NotifyIcon_DoubleClick(object sender, EventArgs e)
        {
            if (WindowState == WindowState.Minimized)
            {
                Show();
                WindowState = WindowState.Normal;
                ShowInTaskbar = true;
            }
            else
            {
                IntPtr hWnd = App.FindWindow(null, "My Managed Window");
                App.ShowWindow(hWnd, 9);
            }
        }

        /// <summary>
        /// 窗口关闭事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            IntPtr hWnd = App.FindWindow(null, "My Managed Window");
            App.ShowWindow(hWnd, 0);
            e.Cancel = true;
        }
    }
}

App.xaml.cs 代码:

using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        [DllImport("USER32.DLL", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string classname, string captionName);

        [DllImport("USER32.DLL")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("USER32.DLL")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        public System.Threading.Mutex mutex;
        public App()
        {
            this.Startup += new StartupEventHandler(App_Startup);
        }

        /// <summary>
        /// 单例窗口,防止用户打开多个窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void App_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                bool ret;
                mutex = new System.Threading.Mutex(true, "My Managed Window", out ret);
                if (!ret)
                {
                    IntPtr hWnd = FindWindow(null, "My Managed Window");
                    ShowWindow(hWnd, 9);
                    SetForegroundWindow(hWnd);
                    Environment.Exit(0);
                }
            }
            catch (Exception /*ex*/)
            {
                Environment.Exit(0);
            }
        }

    }
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的NotifyIcon控件可以在系统托盘中显示一个小图标,并提供一些菜单选项。以下是使用C#实现NotifyIcon控件的步骤: 1. 在Visual Studio中创建一个Windows Forms应用程序。 2. 在工具箱中找到NotifyIcon控件并将其拖放到窗体上。 3. 在属性窗口中设置NotifyIconIcon属性为要显示的图标。 4. 将NotifyIcon的Visible属性设置为true,这样它就会显示在系统托盘中。 5. 在工具箱中找到ContextMenuStrip控件并将其拖放到窗体上。 6. 在ContextMenuStrip中添加要显示的菜单项。 7. 双击每个菜单项,添加相应的事件处理程序。 8. 在NotifyIcon的ContextMenuStrip属性中选择刚刚创建的ContextMenuStrip。 9. 运行程序,单击NotifyIcon图标,就会显示出菜单项。 下面是一个示例代码: ```csharp private void Form1_Load(object sender, EventArgs e) { // 设置NotifyIcon图标 notifyIcon1.Icon = new Icon("icon.ico"); // 创建ContextMenuStrip并添加菜单项 ContextMenuStrip menuStrip = new ContextMenuStrip(); menuStrip.Items.Add("Exit"); menuStrip.Items.Add("Stop"); // 为菜单项添加事件处理程序 menuStrip.Items[0].Click += new EventHandler(Exit_Click); menuStrip.Items[1].Click += new EventHandler(Stop_Click); // 将ContextMenuStrip关联到NotifyIcon notifyIcon1.ContextMenuStrip = menuStrip; } private void Exit_Click(object sender, EventArgs e) { // 处理Exit菜单项的事件 Application.Exit(); } private void Stop_Click(object sender, EventArgs e) { // 处理Stop菜单项的事件 // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值