【问题标题】:Application re-launch, elevated "runas", does not capture TaskbarButtonCreated Msg before ITaskbarList use?应用程序重新启动,提升“runas”,在 ITaskbarList 使用之前不捕获 TaskbarButtonCreated Msg?
【发布时间】:2016-03-22 01:30:38
【问题描述】:

使用 Borland C++ Builder。

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c++ winapi c++builder c++builder-2010


    【解决方案1】:

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

    【讨论】:

    • 谢谢@Ruslan。即使包含 windows.h ,我也会收到未定义的函数错误。我还担心它会在 XP 上产生错误,因为文档指出它是 Windows 7 及更高版本。
    • 出于好奇,是否存在从未创建任务栏图标的情况?如果不是,并且作为备用方案,我可以假设在显示主窗体并触发第一个 OnIdle 事件时已创建图标。
    • ChangeWindowMessageFilterEx() 定义在winuser.h 中,它包含在windows.h 中。确保 WINVER 定义为 >= 0x0601 以使用它。在任何情况下,您都必须在 XP 和 Vista 上使用 ChangeWindowMessageFilter(),因此请使用 GetProcAddress() 在运行时加载 ChangeWindowMessageFilterEx(),如果不可用则回退。
    • 至于TaskbarButtonCreated 消息,它是在创建窗口的任务栏按钮(因此得名)时传递的,直到窗口显示才发生。只要在创建窗口之后,在显示窗口之前注册消息过滤器,就可以了。这样做的一个好地方是在您的表单的 CreateWnd() 方法中(如果表单的 HWND 曾经重新创建,它还允许您重新注册消息过滤器)。
    • @Peter:构造函数来不及了。 HWND 已经创建,并且表单的 DFM 已经流式传输。如果这是您的主表单,它会默认自动显示,因此它的任务栏按钮也可能已经创建。正如我之前所说,您应该覆盖表单的虚拟CreateWnd() 方法并从那里进行过滤器注册。这样,您可以在创建 HWND 之后立即注册过滤器,然后再对其进行过多操作。当然,这假设Application.MainFormOnTaskbar 为真(默认为真)
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多