如何强悍地实现“置顶窗口”,让窗口不被其他窗口覆盖

paschen 2018-06-02 03:43:16
加精
使用WS_EX_TOPMOST创建或SetWindowPos(hWnd, HWND_TOPMOST, ...)设置的置顶窗口,仍然可以被其他置顶窗口所覆盖

如何能够优雅地实现窗口置顶后不能被其他顶层窗口覆盖?

WIN10系统自带的任务管理器中,设置“置于顶层”后无法被其他置顶窗口覆盖(仅WIN10,WIN7会被覆盖),这和我期望的完美吻合,但不知如何实现

之前尝试过失去焦点时AttachThreadInput其他顶层窗口后,再SetForegroundWindow自己,具体代码如下:


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TOPWNDTEST));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TopWndTest";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassExW(&wcex);

HWND hWnd = CreateWindowExW(WS_EX_TOPMOST, L"TopWndTest", L"这是一个置顶窗口", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KILLFOCUS:
{
HWND hForegdWnd = GetForegroundWindow();
DWORD dwForegdWndThreadID = GetWindowThreadProcessId(hForegdWnd, NULL);
DWORD dwThreadID = GetCurrentThreadId();
AttachThreadInput(dwThreadID, dwForegdWndThreadID, TRUE);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
AttachThreadInput(dwThreadID, dwForegdWndThreadID, FALSE);
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


但上述方法有较多局限且不够优雅:1、影响其他窗口消息;2、效率低拖动时闪烁;3、仍然会被WIN10任务管理器覆盖

有没大牛对此有研究过,指点一二
...全文
37351 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
watermelonCloud 2021-06-26
  • 打赏
  • 举报
回复

今天发现一个可以盖过锁屏界面和激活windows文字的 可以搜索一下:todesk隐私屏 很好奇是什么原理,据我所知是用的驱动

leonadaclaire 2021-03-10
  • 打赏
  • 举报
回复
你们都想多了,explorer就是瘟都死开发的, explorer就算被杀掉,任务管理器还是能起来 自己琢磨把。。。。。。 有个“超级祖宗窗口”挂在所有窗口之上, 是瘟都死显示的基石,悬于瘟都死屏幕上。 你们发的所有onpaint窗体消息,它都能给你们拦喽。 这就是~~~~~~~~~~~· ghost windows(幽灵窗口)
  • 打赏
  • 举报
回复
也就是说窗口还分阶级,透明天花板~
MIAIONE 2021-03-05
  • 打赏
  • 举报
回复 1
这篇已经说的很明白了,在win10中,根本就不是由同一函数创建的,72楼说对了:https://blog.csdn.net/weixin_43820461/article/details/107610331
sanhill 2021-02-04
  • 打赏
  • 举报
回复 1
今天发现,搜狗输入法的窗口可以在win10的任务管理器之上。这个输入法的小窗口是咋做的?
SlimeNull 2020-10-03
  • 打赏
  • 举报
回复 1
都2020年了, 还没有解决吗, 有点难搞噢 我是用计时器, 不断置顶的, 勉强满足需求, 如果能实现像任务管理器那样的硬性置顶, 那就更好了. 我的发现: 似乎窗口有两类, 1.普通窗口 2.置顶窗口, 这两个窗口的关系是: 普通窗口始终会被置顶窗口覆盖. 置顶窗口可以是多个, 并且置顶窗口之间, 一个可以覆盖另一个, 并不是之前某人所说的, 置顶窗口只有一个. 不过真正在最顶端的窗口也的确只有一个. 值得一提的是, 任务栏的次序介于普通窗口和置顶窗口之间, 普通窗口无法覆盖任务栏, 任务栏无法覆盖置顶窗口, 但是嘞, 在打开开始菜单时, 开始菜单和任务栏会进入介于置顶窗口和最顶级(任务管理器)的状态. 除了任务管理器和放大镜, 任何窗口都无法覆盖开始菜单与任务栏. 噢, 当然, 除了任务栏和放大镜, '通知'也是无法被覆盖的. 其他: Windows的放大镜始终位于任务管理器顶端. 而且任务管理器和放大镜可以覆盖任何东西, 包括系统的任何东西, 比如开始菜单. 通知, (就是不知道能否覆盖那个Windows未激活的标志)
luoyely 2019-10-28
  • 打赏
  • 举报
回复
引用 74 楼 LshSm_ 的回复:
我试过,放大镜可以遮住任务管理器

厉害,这都被你发现了,而且这个置顶感觉也没什么必要啊,任务管理器置顶后虽然显示是置顶了,但是当你打开其他新窗口后,焦点已经在新打开的窗口了。
zyrr159487 2019-10-28
  • 打赏
  • 举报
回复
onpaint的时候置顶,只要被遮盖就会引起重绘
schlafenhamster 2019-10-27
  • 打赏
  • 举报
回复
A ghost window replaces a window that hasn't called Get or PeekMessage for 5 seconds, in other words a hung window. It displays a bitmap of the hung window's client area
LshSm_ 2019-10-27
  • 打赏
  • 举报
回复
我试过,放大镜可以遮住任务管理器
零隐 2019-09-29
  • 打赏
  • 举报
回复
每个程序都想顶置。·~~都成流氓程序了。
其实我感觉 SetWindowPos 够用。至于被其它程序遮住,一般没什么办法。
data-v-165b75c4 2019-09-27
  • 打赏
  • 举报
回复
据说任务管理器用的是CreateWindowInBand
gongjiangang2012 2019-08-10
  • 打赏
  • 举报
回复
以前想要程序全屏就碰到这个问题,,任务管理器真是强悍。
bbjhn 2019-07-30
  • 打赏
  • 举报
回复
试一下这个bat文件:
文件名:dead.bat
while 1:
start
dead
pause
schlafenhamster 2019-04-02
  • 打赏
  • 举报
回复
是不是与进程 优先度有关 ,提高试试。
qq_42701547 2018-07-15
  • 打赏
  • 举报
回复 1
只想问问强悍的程序开2个,肯定有一个不强悍了吧。还是定时器大法好
qq_42701547 2018-07-15
  • 打赏
  • 举报
回复
会不会是系统对那一个窗体“特殊照顾”而实现的结果呢?

毕竟用真正“TOPMOST”的只能有一个,通过创建时标识或“后期”API置顶,
  那些窗口都是“平级”的,这时自然就是哪个窗体拥有焦点、哪个窗体就会到“最顶层”。
sololie 2018-07-13
  • 打赏
  • 举报
回复
引用 62楼sololie 的回复:
想到的是把欲置顶窗口区域的重绘消息处理掉
漏了个 非 字
sololie 2018-07-13
  • 打赏
  • 举报
回复
想到的是把欲置顶窗口区域的重绘消息处理掉
z-xiaoyao 2018-06-30
  • 打赏
  • 举报
回复
还没新发现,这问题不一定能完美解决,主要来听下大家意见
加载更多回复(51)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧