我正在使用 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,并且控制台打印“等待有效的窗口句柄...”。 我的问题:
如果您想获取 HWND 以进行与窗口相关的任何 Win32 API 调用,您应该将
WindowPtr
传递给 GetWin32Window
函数。
即使多个框架或库都有“窗口句柄”的概念,但这并不意味着这些框架会识别彼此的句柄或知道如何处理它们。