Ich habe diese Fensterstruktur:
- Fenster 1
Fenster 2 (im Besitz von Fenster 1)
Fenster 3 (im Besitz von Fenster 2)
Fenster X (im Besitz von ...)
Ich verwende einen Maus-Hook, um zu prüfen, ob sich die Maus beim Anklicken über JEDEM der aktuell geöffneten Fenster befindet, sodass ich die gesamte Hierarchie schließen kann, wenn dies nicht der Fall ist.
Aber aus irgendeinem Grund wird immer angezeigt, selbst wenn ich auf eines der Fenster klicke false in meiner IsInHierarchy. Irgendeine Idee, warum und wie man das beheben kann?
Der Code, den ich verwende:
Code: Select all
internal sealed class PopupMenuDismissHook : IDisposable
{
private readonly nint _rootHWnd;
private readonly PInvoke.LowLevelMouseProc _hookProc;
private readonly nint _hookHandle;
public nint LeafHWnd { get; set; }
public PopupMenuDismissHook(nint rootHWnd)
{
_rootHWnd = rootHWnd;
_hookProc = new PInvoke.LowLevelMouseProc(LowLevelMouseProcFunc);
_hookHandle = PInvoke.SetWindowsHookEx(PInvoke.WH_MOUSE_LL, Marshal.GetFunctionPointerForDelegate(_hookProc), nint.Zero, 0);
}
public void Dispose()
{
if (_hookHandle != nint.Zero) PInvoke.UnhookWindowsHookEx(_hookHandle);
}
private nint LowLevelMouseProcFunc(int nCode, nint wParam, nint lParam)
{
if (nCode >= 0)
{
if (wParam is PInvoke.WM_LBUTTONUP or PInvoke.WM_RBUTTONUP or PInvoke.WM_MBUTTONUP)
{
var mousePos = Marshal.PtrToStructure(lParam).pt;
if (!IsInHierarchy(mousePos)) PInvoke.PostMessage(_rootHWnd, PInvoke.WM_CLOSE, nint.Zero, nint.Zero);
}
}
return PInvoke.CallNextHookEx(_hookHandle, nCode, wParam, lParam);
}
private bool IsInHierarchy(POINT mousePos)
{
var current = LeafHWnd;
Console.WriteLine(current);
while (current != nint.Zero)
{
if (PInvoke.GetWindowRect(current, out var rect))
{
//Debug
Console.WriteLine($"Rect: {rect.Left},{rect.Top},{rect.Right},{rect.Bottom}");
Console.WriteLine($"Mouse: {mousePos.x},{mousePos.y}");
if (PInvoke.PtInRect(ref rect, mousePos)) return true;
}
current = PInvoke.GetWindow(current, PInvoke.GW_OWNER);
}
//Debug
Console.WriteLine("FALSE");
return false;
}
}
Mobile version