【发布时间】: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