自定义 Shell 的自定义系统托盘

Custom System Tray for a Custom Shell

我正在为 Windows 7 / 8 创建自定义 shell。如何为我的 shell 创建自定义托盘?我知道托盘 window 的名称是 class "Shell_TrayWnd"。我尝试自己创建它并使用 PostMessage 发布 "TaskbarCreated" 消息,但我的 Tray WndProc 中没有收到 "WM_COPYDATA" 消息。我错过了什么?需要帮助。

代码如下:

static LRESULT CALLBACK tray_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{
   if (uMsg == WM_COPYDATA)
   {
        COPYDATASTRUCT *cpdata = (COPYDATASTRUCT*)lParam;
   }
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int init_tray(void) 
{
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.lpfnWndProc = tray_proc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = TEXT("Shell_TrayWnd");

    if (!RegisterClass(&wc)) 
    {
        return 0;
    }

tray_window = CreateWindowEx(
    WS_EX_TOOLWINDOW,
    wc.lpszClassName,
    NULL,
    WS_POPUP,
    0, 0, 0, 0,
    NULL, NULL,
    wc.hInstance,
    NULL);

if (!tray_window)
    return 0;

/* let running apps know that a new tray is around */
PostMessage(HWND_BROADCAST, RegisterWindowMessage(TEXT("TaskbarCreated")), 0, 0);

return 1;
}

成功了!

SendNotifyMessage(HWND_BROADCAST, RegisterWindowMessage("TaskbarCreated"), 0, 0);

这条消息是关键。没有这个,Tray WndProc 将不会获取数据。