【问题标题】:Custom System Tray for a Custom Shell自定义外壳的自定义系统托盘
【发布时间】:2015-01-06 12:33:57
【问题描述】:

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

【问题讨论】:

  • 如何广播与WM_COPYDATA 相关的"TaskbarCreated" 消息?也许您的客户联络员应该与客户联系,并为您提供真实的、完整的问题。正如所发布的那样,它编译起来并没有多大意义。
  • 我在另一个 shell 中看到,“TaskbarCreated”消息是在创建托盘窗口后广播的。如果这没有意义,你介意帮助我吗?我的目标是获得一个自定义托盘。
  • 我会从使用正确的术语开始。它从未被称为托盘。这是通知区域。
  • @IInspectable:"TaskbarCreated" 消息让应用程序知道任务栏可用,包括其通知区域。一些应用程序会在调用(或重新调用)Shell_NotifyIcon() 之前等待该消息,然后将WM_COPYDATA 消息发送到Shell_TrayWnd 窗口。我的猜测是,Aster 要么没有正确创建/注册Shell_TrayWnd 窗口,没有正确广播"TaskbarCreated" 消息,或者没有正确处理以Shell_TrayWnd 窗口为目标的消息。很难说,因为没有显示代码。
  • @RemyLebeau:我现在添加了代码。

标签: shell winapi system-tray


【解决方案1】:

搞定了!

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2022-05-31
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多