Win32:如何通过hWnd隐藏任务栏中的第三方窗口

时间:2011-08-28 04:37:06

标签: c++ windows winapi

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

我已经使用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);      

我在这里错误地隐藏了任务栏中新创建的窗口?

2 个答案:

答案 0 :(得分:21)

在您使用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扩展样式的无主窗口。作为一个   替代方案,您可以创建一个隐藏的窗口并使其隐藏   窗口是可见窗口的所有者。

     

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

答案 1 :(得分:1)

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