【问题标题】:Win32: How to hide 3rd party windows in taskbar by hWndWin32:如何通过 hWnd 在任务栏中隐藏 3rd 方窗口
【发布时间】:2011-08-28 04:37:06
【问题描述】:

我必须在第三方库中隐藏弹出窗口。

我已经用SetWindowsHookEx 实现了 windows 钩子的东西,并且知道所有新创建的 hWnd(s)。我听HSHELL_WINDOWCREATED 回调并执行以下操作:

long style= GetWindowLong(hWnd, GWL_STYLE);
style &= ~(WS_VISIBLE);    // this works - window become invisible 

style |= WS_EX_TOOLWINDOW;   // flags don't work - windows remains in taskbar
style &= ~(WS_EX_APPWINDOW); 

SetWindowLong(hWnd, GWL_STYLE, style);      

在任务栏中隐藏新创建的窗口我做错了什么?

【问题讨论】:

  • WS_EX_* 需要使用 GWL_EXSTYLE 获取/设置 - 而不是 GWL_STYLE。 (WS_EX_TOOLWINDOW 的值为 0x00000080,如果您将其用作 GWL_STYLE 而不是 _EXSTYLE,最终将修改通常不用于应用程序窗口的窗口样式部分,因此似乎是无操作的。低的部分Windows 样式的通常用于特定于控件的样式位 - 例如,对于按钮,这与 BS_BITMAP 具有相同的值。)

标签: c++ windows winapi


【解决方案1】:

在使用SetWindowLong 之前,先调用ShowWindow(hWnd, SW_HIDE),然后调用SetWindowLong,然后再调用ShowWindow,就像ShowWindow(hWnd, SW_SHOW)。所以您的代码将如下所示:

long style= GetWindowLong(hWnd, GWL_STYLE);
style &= ~(WS_VISIBLE);    // this works - window become invisible 

style |= WS_EX_TOOLWINDOW;   // flags don't work - windows remains in taskbar
style &= ~(WS_EX_APPWINDOW); 

ShowWindow(hWnd, SW_HIDE); // hide the window
SetWindowLong(hWnd, GWL_STYLE, style); // set the style
ShowWindow(hWnd, SW_SHOW); // show the window for the new style to come into effect
ShowWindow(hWnd, SW_HIDE); // hide the window so we can't see it

这是来自Microsoft's Website的相关引用:

要防止窗口按钮被放置在任务栏上,请创建 具有 WS_EX_TOOLWINDOW 扩展样式的无主窗口。作为一个 或者,您可以创建一个隐藏窗口并将其隐藏 window 可见窗口的所有者。

只有在 window 的样式支持可见的任务栏按钮。如果你想 动态地将窗口的样式更改为不支持的样式 可见的任务栏按钮,你必须先隐藏窗口(通过调用 ShowWindow with SW_HIDE),更改窗口样式,然后显示 窗口。

【讨论】:

  • 对不起,它对我不起作用。我之前成功隐藏的 Windows 现在可以在任务栏中看到并显示。
  • @Andrew 这很奇怪。它可能不起作用,但出于好奇,请在拨打 ShowWindow(hWnd, SW_SHOW); 之后尝试 SetWindowLong。所以代码会去ShowWindow(hWnd, SW_HIDE); SetWindowLong(hWnd, GWL_STYLE, style); ShowWindow(hWnd, SW_SHOW); SetWindowLong(hWnd, GWL_STYLE, style);
  • @Andrew 您还使用什么标志作为SetWindowsHookEx 的第一个参数?
  • @Andrew,如果该修改不起作用,请将第二次调用 SetWindowLong 更改为 ShowWindow(hWnd, SW_HIDE)
  • @Andrew 非常好。祝你的项目好运。
【解决方案2】:

您必须使用 GWL_EXSTYLE 来获取/设置 EX 标志,GWL_STYLE 不适用于 EX 标志。

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 2017-05-28
    • 2010-11-18
    • 2023-01-17
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多