程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用C#實現智能設備上的NotifyIcon類(2)

用C#實現智能設備上的NotifyIcon類(2)

編輯:關於C語言
面是NotifyIcon類的實現,別忘了引用Microsoft.WindowsCE.Forms。注意Add方法提供了不同的重載形式,具體請參看注釋:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace NotifyClIEnt
{
  /**//// <summary>
  /// 智能設備托盤圖標類
  /// </summary>
  public class NotifyIcon
  {
    //單擊事件
    public event System.EventHandler Click;
    private MyMessageWindow messageWindow;
    private int uID = 5000;
    private System.Drawing.Icon _Icon;
    public NotifyIcon()
    {
      messageWindow = new MyMessageWindow(this);
      messageWindow.uID = uID;
    }
    public System.Drawing.Icon Icon
    {
      set
      {
        _Icon = value;
      }
    }
    ~NotifyIcon()
    {
      Remove();
    }
    /**//// <summary>
    /// 添加托盤圖標
    /// </summary>
    /// <param name="hIcon">icon文件的有效句柄</param>
    public void Add(IntPtr hIcon)
    {
      NotifyMessage(messageWindow.Hwnd, NIM_ADD, (uint)uID, hIcon);
    }
    /**//// <summary>
    /// 添加托盤圖標
    /// </summary>
    /// <param name="IconRes">編譯之後的資源文件中的icon資源名稱,如“#201547”</param>
    public void Add(string IconRes)
    {
      IntPtr hIcon = LoadIcon(GetModuleHandle(null), IconRes);
      NotifyMessage(messageWindow.Hwnd, NIM_ADD, (uint)uID, hIcon);
    }
    /**//// <summary>
    /// 添加托盤圖標
    /// </summary>
    /// <param name="icon">icon文件</param>
    public void Add(System.Drawing.Icon icon)
    {
      NotifyMessage(messageWindow.Hwnd, NIM_ADD, (uint)uID, icon.Handle);
    }
    /**//// <summary>
    /// 添加托盤圖標;icon為屬性中的icon
    /// </summary>
    public void Add()
    {
      if (_Icon != null)
      {
        NotifyMessage(messageWindow.Hwnd, NIM_ADD, (uint)uID, _Icon.Handle);
      }
    }
    public void Remove()
    {
      NotifyMessage(messageWindow.Hwnd, NIM_DELETE, (uint)uID, IntPtr.Zero);
    }
    public void Modify(IntPtr hIcon)
    {
      NotifyMessage(messageWindow.Hwnd, NIM_MODIFY, (uint)uID, hIcon);
    }
  
    private void NotifyMessage(IntPtr hwnd, int dwMessage, uint uID, IntPtr hIcon)
    {
      NOTIFYICONDATA notdata = new NOTIFYICONDATA();
      notdata.cbSize = 152;
      notdata.hIcon = hIcon;
      notdata.hWnd = hwnd;
      notdata.uCallbackMessage = WM_NOTIFY_TRAY;
      notdata.uFlags = NIF_MESSAGE | NIF_ICON;
      notdata.uID = uID;
      int ret = Shell_NotifyIcon(dwMessage, ref notdata);
    }
    API#region API
    //定義消息常量
    const int NIF_MESSAGE = 0x00000001;
    const int NIF_ICON = 0x00000002;
    internal const int WM_LBUTTONDOWN = 0x0201;  
    internal const int NIM_ADD = 0x00000000;
    internal const int NIM_MODIFY = 0x00000001;
    internal const int NIM_DELETE = 0x00000002;
    //自定義消息
    internal const int WM_NOTIFY_TRAY = 0x0400 + 2001;
    internal struct NOTIFYICONDATA
    {
      internal int cbSize;
      internal IntPtr hWnd;
      internal uint uID;
      internal uint uFlags;
      internal uint uCallbackMessage;
      internal IntPtr hIcon;      
    }
    [DllImport("coredll.dll")]
    internal static extern int Shell_NotifyIcon(
      int dwMessage, ref NOTIFYICONDATA pnid);
    [DllImport("coredll.dll")]
    internal static extern int SetForegroundWindow(IntPtr hWnd);
    [DllImport("coredll.dll")]
    internal static extern int ShowWindow(
      IntPtr hWnd,
      int nCmdShow);
    [DllImport("coredll.dll")]
    internal static extern IntPtr GetFocus();
    [DllImport("coredll.dll")]
    internal static extern IntPtr LoadIcon(IntPtr hInst, string IconName);
    [DllImport("coredll.dll")]
    internal static extern IntPtr GetModuleHandle(String lpModuleName);
    #endregion
    MessageWindow#region MessageWindow
    internal class MyMessageWindow : Microsoft.WindowsCE.Forms.MessageWindow
    {
      private int _uID = 0;
      private NotifyIcon notifyIcon;
      public MyMessageWindow(NotifyIcon notIcon)
      {
        notifyIcon = notIcon;
      }
      public int uID
      {
        set
        {
          _uID = value;
        }
      }
      protected override void WndProc(ref Microsoft.WindowsCE.Forms.Message msg)
      {
        if (msg.Msg == WM_NOTIFY_TRAY)
        {
          if ((int)msg.LParam == WM_LBUTTONDOWN)
          {
            if ((int)msg.WParam == _uID)
            {
              if (notifyIcon.Click != null)
                notifyIcon.Click(notifyIcon, null);
            }
          }
        }
      }
    }
    #endregion
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved