自定义外壳的自定义系统托盘

时间:2015-01-06 12:33:57

标签: shell winapi system-tray

我正在为Windows 7/8创建自定义shell。如何为我的shell创建自定义托盘?我知道托盘窗口的类名是“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;
}

1 个答案:

答案 0 :(得分:0)

搞定了!

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

此消息是关键。如果没有这个,Tray WndProc将无法获取数据。