将窗口设置为最顶层。

22

我希望将我的窗口始终置于其他窗口之上。我是C++ Win32编程的新手。这是我在WinMain中初始化我的窗口:

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

我之前使用的是对话框,所以最上面的属性非常容易使用。但是在这里,在一个窗口中我不知道该如何设置它。我还想能够触发它。有人可以帮帮我吗?


1
你不能将窗口保持在所有其他窗口的顶部。系统中有多个窗口。当它们都试图成为顶层窗口时,不是所有窗口都能获胜。 - David Heffernan
我指的是 Topmost 属性。 - Victor
@DavidHeffernan: 事实证明你是正确的,对于Windows 8.1。我正在使用一个非常好用的小工具叫做ClockX。当你将鼠标悬停在它上面时,它可以被配置为增加透明度,并支持点击穿透,所以我让它永远置于所有其他窗口之上。然而,偶尔Windows会搞砸它,时钟就会消失。只需要右键单击它的系统托盘图标,但这仍然非常恼人。很多Windows "技术"也是如此。它们随着Windows的发展而逐渐恶化。 - Cheers and hth. - Alf
4个回答

51
SetWindowPos(hwnd01, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

注意:SWP_NOMOVE | SWP_NOSIZE用于忽略SetWindowPos函数的第3、4、5、6个参数。

第二个参数可以是:

  • HWND_BOTTOM

  • HWND_NOTOPMOST(将窗口设置为普通窗口)

  • HWND_TOP

  • HWND_TOPMOST (将窗口始终置顶)


谢谢,这对我来说是一个很好的答案!如果不传递 SWP_NOMOVESWP_NOSIZE,它会起作用吗? - Noitidart
1
您可以使用 GetWindowLong 获取指定窗口的所有信息,并通过 SetWindowLong 更改指定窗口的属性。但是,在调用 SetWindowPos 函数之前,SetWindowLong 不会生效。 - Amir
非常感谢Amir! - Noitidart
1
没有SWP_NOMOVESWP_NOSIZE,窗口将移动到屏幕角落,并且宽度和高度会变为0。 - Anonymous

27

使用 CreateWindowEx 函数,同时设置 (扩展) 窗口样式为 WS_EX_TOPMOST

声明:我已经有大约 15 年没有碰过这个东西了。


我不在电脑前了,但是明天我会测试并标记你的答案。 - Victor

12
请参阅SetWindowPos函数的hWndInsertAfter参数。如果传递HWND_TOPMOST,则可以实现所需效果。
此外,如果您想保留位置和大小不变,可能还需要将SWP_NOMOVE | SWP_NOSIZE传递给uFlags参数。

3

SWP_NOMOVE 保持当前位置(忽略 X 和 Y 参数)。 SWP_NOSIZE 保持当前大小(忽略 cx 和 cy 参数)。 如果您不设置这些标志,则应指定位置和大小,而不是传递0、0、0、0。


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