C# WinAPI click, press itd...

0

Witam, zrobiłem sobie prosty kod, który podpina się pod proces "calc.exe".

foreach (Process proc in Process.GetProcesses())
{
	if (proc.ProcessName.Equals("calc"))
    {
		handle = OpenProcess(2035711, false, proc.Id);
	}
}

Teraz chce wiedzieć o tym, że ktoś nacisnął na klawiaturze np. literkę ,,a" więc robię:

[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(System.Windows.Forms.Keys nrKey);
	
while (true)
{
	if (GetAsyncKeyState(System.Windows.Forms.Keys.A) != 0)
	{
		Console.WriteLine("Nacisniete zostalo a");
	}
    System.Threading.Thread.Sleep(10);
}

i tutaj następuje niespodzianka.
Faktycznie dostaję komunikat, że "a" zostało naciśnięte, ale, nawet gdy nie puszcze klawisza pętla ponownie mówi mi, że moje "a" zostało naciśnięte.

Jak rozpoznać w tej sytuacji interakcje:

  • Click
  • Press
  • Down
    ?
0

No bo jak naciśniesz i trzymasz klawisz, to litera się powtarzaaaaaaaaaaaaaaaaaaaa.....

Od strony sprzętowej wygląda to jak wielokrotne naciśnięcie klawisza bez jego puszczania, dopiero gdy puścisz rejestrowane jest jedno puszczenie na końcu.

0

Podczas przyciśnięcie ,,a" w konsoli otrzymuje np:

-32768
0

Za szybko nacisnąłem enter...

Otrzymuję:

-32768
-32768
-32768
-32768
-32768
-32768
-32768

Podczas jednego naciśnięcia leci jakby 10 printów.

Chyba coś źle robię:

if (GetAsyncKeyState(System.Windows.Forms.Keys.A) != 0) {
	Console.WriteLine(GetAsyncKeyState(System.Windows.Forms.Keys.A));
}

?

0

Dzieje się tak dlatego bo w tym samym czasie jak ty "raz" naciśniesz klawisz "A" pętla wykona około 10 obiegów zanim go puścisz. Czyli 10 razy zobaczy nacisnięty klawisz.

Możesz naprzykład zrobić tak, że po naciśnięciu i jednokrotnym wydrukowaniu komunikatu na wyjście czekasz na to, aż klawisz zostanie puszczony (czyli jeśli dobrze rozumiem to state będzie równy 0). Ale to jest tylko luźny pomysł, może być coś lepszego.

0

GetAsyncKeyState nie czeka na naciśnięcie klawisza; zwraca tylko jego aktualny stan (co często wcale nie jest tym czego potrzebujemy):
https://blogs.msdn.microsoft.com/oldnewthing/20041130-00/?p=37173

1 użytkowników online, w tym zalogowanych: 0, gości: 1