如何检查窗口是否“始终置顶”?

12
在我的实用热键程序中,我有一个全局热键,它通过调用某个函数将当前前景窗口设置为“置顶”或“取消置顶”。
SetWindowPos(hwnd, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetWindowPos(hwnd, HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

目前我需要两个不同的热键,Win+Z 将窗口置于最上层, Win+X 将窗口取消最上层设置。

我在MSDN中找不到可以检查窗口Z顺序的函数,希望有类似 GetWindowOrder 的功能,但实际上并没有。我也尝试过检查窗口的ex标记,如下所示:

dwExStyles & WS_EX_TOPMOST

但是看起来该标志从未被更改,它只是告诉窗口在创建时将自己置于最顶层。

是否有函数可以检查这一点?

2个回答

20

很奇怪,我已经尝试过DWORD dwExStyles = (DWORD)GetWindowLongPtr(hwnd, GWL_EXSTYLE); 然后如果(dwExStyles & WS_EX_TOPMOST) { SetWindowPos(hwnd, HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); - Kaije
你是否实际检查了GetWindowLogPtr返回的内容?你是否因为非前台应用程序难以在其他应用程序中更改z顺序而遭受失败? - David Heffernan
作为未来的参考 - pinvoke.net有一个示例(http://www.pinvoke.net/default.aspx/user32.getwindowlong),展示了如何在C#中实现它。 - Filip Skakun

3

您正在寻找GetWindow()

检索具有指定关系(Z-Order 或所有者)的窗口与指定窗口的句柄。


我有一个窗口句柄,我想知道这个句柄是否被设置为始终位于其他窗口之上。 - Kaije
1
Stuart已经告诉了你如何检索最顶层的样式,我的答案告诉你如何遍历Z顺序。 - David Heffernan

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