【发布时间】:2015-04-06 12:35:20
【问题描述】:
我正在编写一个 WPF 应用程序,它将在系统托盘中放置一个图标,作为练习,我想在不依赖 System.Windows.Forms 并使用其 NotifyIcon 或 NativeWindow 类的情况下执行此操作。
这相当简单 - 从 C# 调用 Shell_NotifyIcon 并不难 - 事实上,我已经成功完成了我的任务。
作为这项工作的一部分,我不得不创建一个窗口句柄,其唯一目的是从系统托盘接收消息。我按如下方式创建本机窗口:
// Create a 'Native' window
_hwndSource = new HwndSource(0, 0, 0, 0, 0, 0, 0, null, parentHandle);
_hwndSource.AddHook(WndProc);
消息循环挂在AddHook() 中,消息在如下所示的函数中处理:
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// Handle windows messages in this...
}
最后,当需要销毁这个东西时,我通过发布WM_CLOSE 消息并处理HwndSource 来关闭窗口。
if (null != _hwndSource)
{
UnsafeNativeMethods.PostMessage(_hwndSource.Handle, WindowMessage.WM_CLOSE, 0, 0);
_hwndSource.Dispose();
_hwndSource = null;
}
我的问题是这样的:HwndSource的构造函数的前三个参数分别是本机Win32窗口的类样式、样式和扩展样式。对于仅用作窗口消息目标的不可见窗口,它们应该是什么?
我的默认值为零、零和...呃.. 零确实有效,但我使用 Spy++ 来检查 Windows.Forms.NotifyIcon 的作用,似乎它创建的 NativeWindow 具有以下内容:
Class Style: <zero>
Styles: WS_CAPTION, WS_CLIPSIBLINGS,
WS_OVERLAPPED
Extended Styles: WS_EX_LEFT, WS_EX_LTRREADING,
WS_EX_RIGHTSCROLLBAR, WS_EX_WINDOWEDGE
这些对于不可见的窗口是否重要? (我认为不是。)
【问题讨论】: