MouseKeyHook के साथ वैश्विक माउस का पता नहीं लगा सकते

Dec 31 2020

मैं पिछले कुछ घंटों से यह जानने के लिए शोध कर रहा हूं कि विश्व स्तर पर माउस के क्लिकों का पता कैसे लगाया जाए (ध्यान केंद्रित नहीं किया गया) और Globalmousekeyhook का उपयोग करने के लिए उल्लिखित कई पदों पर ठोकर खाई, जिसे मैंने NuGet के माध्यम से स्थापित किया है जिसे मैंने नीचे देखा है:

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.");
        }
    }
}

जब मैं इसे चलाता हूं, तो मेरा ऑन स्क्रीन माउस अचानक उस बिंदु पर पिछड़ने लगता है जहां यह अनुपयोगी होता है (मैंने कमांड प्रॉम्प्ट को बंद करने के लिए भी संघर्ष किया है) और मैंने बाएं और दाएं दोनों पर क्लिक करने की भी कोशिश की है, लेकिन कुछ भी लॉग नहीं हुआ है। क्या मैं पूरी तरह से बेवकूफ बना रहा हूं? मुझे लगता है कि वास्तव में कुछ स्पष्ट है मुझे याद आ रहा है क्योंकि कोई और इस मुद्दे को नहीं उठा रहा है, या यदि कोई अन्य समाधान है तो मुझे इसे आज़माने में खुशी होगी। धन्यवाद।

विजुअल स्टूडियो 2019, विंडोज 10 प्रो, प्रोजेक्ट: .NET फ्रेमवर्क 4.7.2, कंसोल एप्लीकेशन, डिबग मोड के साथ चला

जवाब

EpicSpeedy Jan 03 2021 at 08:41

मैं वास्तव में हमेशा की तरह चारों ओर खेल रहा था, इसे करने के विभिन्न तरीकों की तलाश कर रहा था और फिर चाबियाँ (GetKeyStates) (माउस सहित ) की स्थिति प्राप्त करने के लिए विंडोज एपीआई फ़ंक्शन पर ठोकर खाई , इसलिए मैंने user32 DLL आयात किया और एक लूप शुरू किया - चेक बाईं माउस बटन स्थिति ( 0x01) हर 50ms (पाया कि सबसे अच्छा समय हो) और इसे एक धागे में फेंक दिया ताकि यह मुख्य ब्लॉक न हो।

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!");
        }
    }
}

शायद इसके लिए एक बेहतर समाधान है (जो मुझे नहीं मिला) और इसलिए मैं इसका उपयोग कर रहा हूं। मैं मूल रूप से अपने सटीक प्रश्न के उत्तर पर आधारित था, लेकिन इसके बजाय इसे पायथन में लिखा गया था इसलिए मैंने इसे C # में बदल दिया। मैं अपने सवाल का एक ही जवाब देखकर बीमार हो रहा था कि 'कुछ 3 पार्टी लाइब्रेरी का उपयोग करें' जो कि किसी भी कारण से मेरे लिए ठीक से काम नहीं करता है और 30mb से 7mb :) तक मेमोरी का उपयोग कम किया है।

मैंने विंडोज 7 पर भी इसका परीक्षण किया है और यह अद्भुत काम करता है।