使用 OpenGL GLFW 置顶窗口

警告
本文最后更新于 2021-02-02,文中内容可能已过时。

想做一个BS刷野辅助器, 但是用WPF的TopMost不能在全屏游戏下置顶. 辗转了几天, 终于找到了解决方案 —— 使用 OpenGL GLFW.

我用的是 .Net + OpenTK 开发, 就把一些需要注意的一起写在这.

GLFW 有一个函数 SetWindowAttrib, 顾名思义是设置窗口属性的, 属性里有一个 FLOATING, 窗口浮动, 也就是置顶.

GLFW_FLOATING indicates whether the specified window is floating, also called topmost or always-on-top. This can be set before creation with the GLFW_FLOATING window hint or after with glfwSetWindowAttrib.

那么我们设置这个属性就行了.

大概这样写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
using OpenTK.Windowing.Desktop;
using OpenTK.Windowing.GraphicsLibraryFramework;

namespace BSTimer
{
    class TextWindow : GameWindow
    {
        public TextWindow(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings)
        {
            SetWindowFloating();
        }

        unsafe private void SetWindowFloating()
        {
            GLFW.SetWindowAttrib(this.WindowPtr, WindowAttribute.Floating, true);
        }
    }
}

吐槽一下LearnOpenTK的文档, 估计几百年没更新过了, GameWindow的构造函数都不对

OpenTK.Windowing.Desktop.Window 下有一个 WindowPtr 指针变量, 专门用于传入 GLFW 使用的, 但是微软不让我用指针, 所以要在函数前面用 unsafe 声明一下, 然后编译选项里开启 /unsafe (vs会提示, 写完直接在提示的地方点开启就行).

参考链接: https://blog.gaein.cn/passages/GLFW-Window-Float/