MouseKeyHook ile genel fare aşağı algılanamıyor
Son birkaç saattir fare sol tıklamalarını global olarak nasıl tespit edeceğimi (odaklanmamış) bulmak için araştırma yapıyorum ve aşağıda görüldüğü gibi NuGet aracılığıyla yüklediğim globalmousekeyhook'u kullanmaktan bahseden birden fazla gönderiye rastladım :
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.");
}
}
}
Çalıştırdığımda, ekrandaki farem aniden kullanılamaz olduğu noktaya kadar gecikmeye başladı (komut istemini kapatmak için bile uğraştım) ve ayrıca hem sola hem de sağa tıklamayı denedim ama hiçbir şey kaydedilmiyor. Tamamen aptalca bir şey mi yapıyorum? Kaçırdığım gerçekten bariz bir şey olduğunu hissediyorum çünkü başka kimse bu sorunu yaşamıyor ya da başka bir çözüm varsa, denemekten memnuniyet duyarım. Teşekkür ederim.
Visual Studio 2019, Windows 10 Pro, Proje: .NET Framework 4.7.2, Konsol Uygulaması, hata ayıklama modunda çalıştırıldı
Yanıtlar
Aslında her zamanki gibi oynuyordum, bunu yapmanın farklı yollarını arıyordum ve ardından tuşların durumlarını (GetKeyStates) (fare dahil ) almak için Windows API işlevine rastladım , bu yüzden user32 DLL'yi içe aktardım ve kontrol eden bir döngü başlattım sol fare düğmesi durumu ( 0x01
) her 50 ms'de bir (en iyi zaman olduğunu buldu) ve ana olanı engellememesi için onu bir ileti dizisine attı.
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!");
}
}
}
Muhtemelen bunun için (bulamadığım) daha iyi bir çözüm var ve bu yüzden bunu neden kullanıyorum. Başlangıçta bunu tam soruma bir cevaba dayandırdım, ancak bunun yerine Python'da yazılmıştı, bu yüzden onu C #'a çevirdim. Sorumun tek cevabını, herhangi bir nedenle benim için düzgün çalışmayan ve ayrıca bellek kullanımını 30mb'den 7mb'ye düşüren 'bazı 3. parti kütüphaneleri kullanmak' olduğunu görmekten bıktım :).
Windows 7'de de test ettim ve harika çalışıyor.