Mit MouseKeyHook kann die globale Maus nicht erkannt werden

Dec 31 2020

Ich habe in den letzten Stunden nachgeforscht , um herauszufinden, wie Mausklicks weltweit (nicht fokussiert) global erkannt werden können , und bin auf mehrere Beiträge gestoßen, in denen die Verwendung von globalmousekeyhook erwähnt wurde, das ich über NuGet installiert habe und das ich wie folgt implementiert habe:

using Gma.System.MouseKeyHook;
using System;

namespace mouse_hook_test
{
    class Program
    {
        static private IKeyboardMouseEvents m_GlobalHook;

        static void Main(string[] args)
        {
            Subscribe();

            Console.ReadKey();
        }

        static public void Subscribe()
        {
            m_GlobalHook = Hook.GlobalEvents();

            m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
        }

        static private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
        {
            Console.WriteLine("Mouse Click.");
        }
    }
}

Wenn ich es starte, bleibt meine Bildschirmmaus plötzlich so weit zurück, dass sie unbrauchbar wird (ich hatte sogar Probleme, die Eingabeaufforderung zu schließen), und ich habe auch versucht, sowohl nach links als auch nach rechts zu klicken, aber es wird nichts protokolliert. Mache ich etwas völlig dummes? Ich habe das Gefühl, dass etwas wirklich Offensichtliches fehlt, weil niemand anderes dieses Problem hat, oder wenn es eine andere Lösung gibt, würde ich es gerne versuchen. Vielen Dank.

Visual Studio 2019, Windows 10 Pro, Projekt: .NET Framework 4.7.2, Konsolenanwendung, wurde im Debug-Modus ausgeführt

Antworten

EpicSpeedy Jan 03 2021 at 08:41

Ich habe wie gewohnt herumgespielt , nach verschiedenen Möglichkeiten gesucht und bin dann auf die Windows-API-Funktion zum Abrufen von Schlüsselzuständen (GetKeyStates) (einschließlich der Maus) gestoßen. Deshalb habe ich die user32-DLL importiert und eine Schleife gestartet, die dies überprüft Die linke Maustaste gibt 0x01alle 50 ms den Status ( ) an (dies war die beste Zeit) und warf sie in einen Thread, damit die Hauptzeit nicht blockiert wird.

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace mouse_hook_test
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(detect);
            thread.Start();
        }

        // Import the DLL that contains the function and grab it.
        [DllImport("user32.dll")]
        public static extern short GetKeyState(int vKey);

        // A very simple implementation for tracking the state of the left mouse button.
        static void detect()
        {
            short oldState = GetKeyState(0x01);

            while (true)
            {
                short newState = GetKeyState(0x01);                

                if (oldState != newState)
                {
                    oldState = newState;

                    if (newState < 0)
                    {
                        onMouseClick();
                    }
                }

                Thread.Sleep(50);
            }
        }

        static void onMouseClick()
        {
            Console.WriteLine("Clicked!");
        }
    }
}

Es gibt wahrscheinlich eine bessere Lösung dafür (die ich nicht finden konnte) und warum ich diese verwende. Ich habe dies ursprünglich auf eine Antwort auf meine genaue Frage gestützt, aber stattdessen wurde sie in Python geschrieben, sodass ich sie in C # konvertierte. Ich hatte es satt zu sehen, dass die einzige Antwort auf meine Frage darin bestand, eine Bibliothek von Drittanbietern zu verwenden, die aus irgendeinem Grund für mich nicht richtig funktioniert und die Speichernutzung von 30 MB auf 7 MB gesenkt hat :).

Ich habe es auch unter Windows 7 getestet und es funktioniert wunderbar.