为什么 IsWindow() 函数(winuser.h)无法将 OpenTK 的 WindowPtr 识别为有效的窗口句柄?

问题描述 投票:0回答:1

我正在使用 C# 开发一个 OpenTK 项目,以创建一个允许鼠标事件通过的透明窗口。我想通过调整 OpenTK 窗口的扩展窗口样式来使其可点击。但是,我遇到了一个问题,IsWindow 函数无法将 OpenTK 中的 WindowPtr 识别为有效的窗口句柄。

这是我的代码的相关部分:

[DllImport("user32.dll", SetLastError = true)]
private static extern bool IsWindow(IntPtr hWnd);

public static void MakeWindowClickThrough(IntPtr hWnd)
{
        int exStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
        SetWindowLong(hWnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED | WS_EX_TRANSPARENT);
}

protected override void OnRenderFrame(FrameEventArgs e)
{
    base.OnRenderFrame(e);

    if (!_clickThroughSet)
    {
        IntPtr hWnd = (nint)WindowPtr;
        if (IsWindow(hWnd))
        {
            MakeWindowClickThrough(hWnd);
            _clickThroughSet = true;
            Console.WriteLine("Click-through style set.");
        }
        else
        {
            Console.WriteLine("Waiting for a valid window handle...");
        }
    }

    // ... rest of the rendering code
}

在 OnRenderFrame 中,我尝试使用 IsWindow(hWnd) 检查 WindowPtr 是否是有效的窗口句柄。但是,IsWindow 始终返回 false,并且控制台打印“等待有效的窗口句柄...”。 我的问题:

  1. 为什么 IsWindow 无法将 OpenTK 中的 WindowPtr 识别为有效的窗口句柄?
  2. 是否有不同的方法来获取 IsWindow 可以识别的有效句柄,或者我是否滥用了 WindowPtr?
  3. 有人在使用 OpenTK 时遇到过这个问题吗?有没有其他方法可以在 OpenTK 窗口上设置点击?
c# pinvoke opentk user32
1个回答
0
投票

如果您想获取 HWND 以进行与窗口相关的任何 Win32 API 调用,您应该将

WindowPtr
传递给
GetWin32Window
函数。

即使多个框架或库都有“窗口句柄”的概念,但这并不意味着这些框架会识别彼此的句柄或知道如何处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.