【问题标题】:Set a window to be topmost将窗口设置为最顶层
【发布时间】:2013-02-05 23:57:04
【问题描述】:

我正试图让我的窗口位于所有其他窗口之上。我是 C++ Win32 编程的新手。这是我在WinMain 中初始化我的窗口:

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

我之前使用过对话框,所以最上面的属性真的很容易使用。但是在这里,在一个窗口上我不知道如何设置它。我也希望能够触发它。有人可以帮帮我吗?

【问题讨论】:

  • 您不能将您的窗口置于所有其他窗口之上。系统中有多个窗口。当所有人都试图成为顶级窗口时,并非所有人都能获胜。
  • 我的意思是 Topmost 属性。
  • @DavidHeffernan:碰巧你是对的,对于 Windows 8.1。我正在使用一个名为 ClockX 的出色的小实用程序。当你将鼠标悬停在它上面时,它可以配置为增加透明度,它支持点击,所以我把它放在最上面,在所有其他窗口的顶部。但是,有时 Windows 会弄乱它,时钟就会消失。修复它所需要的只是右键单击其系统托盘图标,但这仍然很烦人。许多Windows“技术”也是如此。随着窗户的发展,它们已经有点退化了。

标签: c++ winapi window topmost


【解决方案1】:
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,它会工作吗?
  • GetWindowLong可以获取指定窗口的所有信息,SetWindowLong可以改变指定窗口的属性。但是SetWindowLong在调用SetWindowPos函数之前不会生效
  • 非常感谢阿米尔!
  • @Noitidart 如果没有SWP_NOMOVESWP_NOSIZE,窗口将移动到屏幕的一角,其宽度和高度将变为0。
【解决方案2】:

CreateWindowEx 与(扩展的)窗口样式WS_EX_TOPMOST 一起使用。

免责声明:距离我接触这些东西大约有 15 年了。

【讨论】:

  • 我不在电脑前了,但明天我会测试并标记你的答案。
【解决方案3】:

参见SetWindowPoshWndInsertAfter 参数。传递HWND_TOPMOST 应该做你想做的事。

此外,如果您想保持位置和大小不变,您可能需要将SWP_NOMOVE | SWP_NOSIZE 传递给uFlags 参数。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2011-03-23
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多