C# Erkennt, ob sich die Maus über einem Fenster in der Hierarchie befindetC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 C# Erkennt, ob sich die Maus über einem Fenster in der Hierarchie befindet

Post by Anonymous »

Wie kann ich überprüfen, ob sich der Mauszeiger über einem Fenster in meiner Fensterhierarchie befindet?

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;
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post