2

使用 Borland C++ 生成器。

在我使用ITaskbarList3之前,我按照 Windows 的要求进行:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd391692.aspx

您的应用程序应调用 RegisterWindowMessage(L"TaskbarButtonCreated") 并在其 wndproc 中处理该消息。在调用任何 ITaskbarList3 方法之前,您的应用程序必须接收到该消息。

然而,这对我来说似乎并不总是有效,我等待的消息永远不会出现,即使 RegisterWindowMessage() 成功。

经过一番挖掘,我发现问题与我的应用程序使用“runas”重新启动自身时有关,在启动后,当基于用户设置时,应用程序需要运行提升。

第二次(现在提升)运行,我等待的消息永远不会出现。

认为这是因为 Windows 已经发送此消息并且它不再发送此消息,即使创建了一个新实例?

假设消息必须已经在第二次(提升)运行时发送,并且仍然继续使用 ITaskbarList3 有多安全?

4

1 回答 1

0

您的应用程序代码必须ChangeWindowMessageFilterEx在创建顶部窗口并注册“TaskbarButtonCreated”消息后调用函数。这将允许第二个(提升的)实例接收“TaskbarButtonCreated”消息。

UINT nTaskbarButtonCreatedMessage = RegisterWindowMessage(TEXT("TaskbarButtonCreated"));
HWND hWnd = {create the top main window and get handle to it}.
ChangeWindowMessageFilterEx(hWnd, nTaskbarButtonCreated, MSGFLT_ALLOW, nullptr);

(这是 VC++ 的代码,但我相信它也适用于 Borland C++ Builder)

于 2015-12-16T03:57:54.533 回答