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

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任务管理器覆盖

有没大牛对此有研究过,指点一二
...全文
37158 71 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
名称 大小 说明 【一卸到底】强悍卸载.exe 144 KB Autoruns.exe 116 KB 禁止U盘及硬盘的自动运行 cpuz.exe 2,190 KB 一款功能强劲的CPU,内存检测工具 CrackDown.exe 391 KB 硬盘信息检测工具 EVEREST+v5.5.exe 7,202 KB 强大的整机硬盘检测,测试,温度显示 Everything.zip 430 KB 极速的文件搜索工具(搜索0.01秒,只支持NTFS分区) FLVPlayer4Free.exe 4,769 KB FLV文件播放器(FLASH) FTPserver.exe 740 KB 精小的FTP服务软件-单功能 GIF动画录制工具.exe 1,417 KB 把屏幕内容录制成GIF文件 GPUZ.exe 429 KB 一款功能强劲的显卡测检工具 HDTune.exe 348 KB 最出名的硬盘检测,测试软件 hfs.exe 2,544 KB 一款功能强大的HTTP文件服务器软件。 ipmsg.exe 156 KB 飞鸽传书-局域网内聊天传送文件最好用的小软件 keycode-finder.exe 20 KB 查看键盘输入键的硬件码 MaxDOS_5.0E.exe 3,577 KB 一款提供DOS操作的软件-功能非常强劲 MiniCD.EXE 482 KB 迷你CD 一款拟光驱工具,把常用ISO化身为CD驱动器 mydisktest.exe 81 KB 强大的U盘测试工具 OEM 自定义工具.exe 222 KB 系统OEM信息定制工具 PrassiONES光碟刻录软件.exe 1,536 KB QQ拼音截图.exe 670 KB Ramdisk_cn.rar 139 KB 内存虚拟盘 UltraISO.exe 1,120 KB 光盘ISO制作工具 Usboot170.exe 453 KB U盘启动工具 U盘芯片检测.exe 234 KB VolumeEasy143b708.exe 77 KB 音量快捷键 暴力删除文件.exe 515 KB 超级巡警出品 窗口文字复制.exe 320 KB 不能复制窗口中的文本吗?试试这个 窗口置顶.exe 46 KB 存储器测速.exe 31 KB 单位换算小精灵.exe 244 KB 飞雪文件分割.rar 91 KB 支持生成合并文件和本软件合并 废客序列号输入助手.exe 129 KB 序列号还需要一段的输入吗?要CTRL+C 然后按F11自动完成。 福昕PDF阅读器.exe 8,124 KB 版本3.0 红叶自动校时v1.8.exe 888 KB 简体转繁体工具.exe 558 KB 截图工具(即时涂鸦).exe 152 KB 进程查看器.exe 2,929 KB 进程管理器.exe 1,589 KB 取色工具.exe 368 KB 输入法调整.exe 26 KB 鼠键回放.exe 956 KB 文件MD5效验工具.exe 881 KB 文件批量改名.exe 13 KB 文件误删恢复.exe 1,418 KB 系统超级工具.exe 1,008 KB 虚拟光驱.exe 124 KB 一触即刹.exe 203 KB

16,548

社区成员

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

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

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