技术开发 频道

用C#实现智能设备上的NotifyIcon类

IT168技术文档

    前几天有网友问.NET CF中怎么实现NotifyIcon,我这才知道原来.NET CF并没有提供NotifyIcon控件。

    于是偶想PC上可以用Shell_NotifyIcon和MessageWindow来实现托盘图标,只是不知道.NET CF支持不支持这两个东东了。仔细看了一下.NET CF中可疑的命名空间,没想到在Microsoft.WindowsCE.Forms命名空间里面竟然有一个MessageWindow 类,太好了,只剩下一个Shell_NotifyIcon 函数了。接着 在Window CE的SDK的帮助文件里,又发现Window CE Platform API已经包含了Shell_NotifyIcon函数。两大“主料”都齐了,只剩下锅了。

    先看一下MessageWindow类,这个类提供了 WndProc 方法,用于处理窗口消息,并公开了可能传递给本机窗口函数的有效窗口句柄。要使用它,派生一个新类,并重写的 WndProc 方法,这样才能截获特定的窗口消息。这里主要用来处理click事件。
    Shell_NotifyIcon的用法如下:

[DllImport("coredll.dll")] internal static extern int Shell_NotifyIcon(int dwMessage, ref NOTIFYICONDATA pnid);

    其中,NOTIFYICONDATA结构如下:

struct NOTIFYICONDATA { int cbSize; IntPtr hWnd; uint uID; uint uFlags; uint uCallbackMessage; IntPtr hIcon; }


    Pnid参数的生命需要注意,是按引用传递的,因为Shell_NotifyIcon 需要一个指向 NOTIFYICONDATA 结构的指针。
hWnd是用来接收任务栏中图标单击消息的窗口的句柄。

    运行示例的时候由于窗体最大化,挡住了任务栏,把窗体最小化之后就能看到托盘图标了。

    下面是NotifyIcon类的实现,别忘了引用Microsoft.WindowsCE.Forms。注意Add方法提供了不同的重载形式,具体请参看注释:

NotifyClient




0
相关文章