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

18

我需要隐藏第三方库中的弹出窗口。

我使用SetWindowsHookEx实现了Windows钩子,并知道所有新创建的hWnd。我监听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);      

我在这里做错了什么,导致无法在任务栏隐藏新创建的窗口?

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

23

在使用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

以下是微软网站的相关引用:

要防止窗口按钮放置在任务栏上,请使用WS_EX_TOOLWINDOW扩展样式创建未拥有的窗口。或者,您可以创建一个隐藏的窗口,并使该隐藏的窗口成为可见窗口的所有者。

仅当窗口的样式支持可见任务栏按钮时,Shell才会从任务栏中移除窗口的按钮。如果您想动态更改窗口的样式以不支持可见任务栏按钮的样式,则必须首先隐藏该窗口(通过调用ShowWindow并使用SW_HIDE),然后更改窗口样式,最后再显示该窗口。


抱歉,它对我不起作用。我之前成功隐藏的窗口现在也会显示在任务栏中。 - Andrew Florko
@Andrew,这很奇怪。这可能行不通,但出于好奇,请尝试在调用ShowWindow(hWnd,SW_SHOW);之后使用SetWindowLong。因此,代码将变为ShowWindow(hWnd,SW_HIDE); SetWindowLong(hWnd,GWL_STYLE,style); ShowWindow(hWnd,SW_SHOW); SetWindowLong(hWnd,GWL_STYLE,style); - Seth Carnegie
@Andrew 很好。祝你的项目顺利。 - Seth Carnegie
WS_EX_TOOLWINDOW和WS_EX_APPWINDOW标志是扩展样式,因此您必须使用GWL_EXSTYLE而不是GWL_STYLE。 - Tutankhamen
1
最后一个隐藏的意义是什么?如果窗口不可见,当然就不会出现在任务栏上。我不明白为什么这能解决问题。 - Wu Zhenwei
显示剩余2条评论

2

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


0
你可以在Init函数中使用以下命令: ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接