2013-02-25 5 views
5

Many examples korzystania z keybd_event, mają wartość 0x45 dla parametru bScan.Jakie jest znaczenie wartości parametru bScan 0x45 w keybd_event?

Jakie jest znaczenie tej wartości 0x45?

Byłem pod wrażeniem 0x45 was a keyboard scancode, ale ponieważ jest on używany do różnych kluczy, nie jestem już tego taki pewien.

Moim celem jest użycie keybd_event albo z .NET P/Invoke, albo z Delphi, i uczynić typy bardziej restrykcyjnymi (używając na przykład enums lub oflagowanych oznaczeń), więc mój kod staje się łatwiejszy w utrzymaniu.

Odpowiedz

5

Rzeczywiście jest to kod skanowania, a dla wielu klawiatur jest to kod skanowania klawisza NumLock.

Przykładowy kod dołączony do dokumentacji keybd_event jest przykładem przełączania stanu NumLock. I tak naturalnie 0x45 jest używany jako kod skanowania. Domyślam się, że wiele innych przykładów, które znalazłeś po prostu skopiował na ślepo tę wartość z przykładu MSDN keybd_event. Od applications typically ignore the scan code i odpowiedzi na kod klucza wirtualnego, zwykle nie ma znaczenia, jaka wartość jest przekazywana jako kod skanowania.

Wreszcie, należy użyć SendInput zamiast keybd_event. Powodem jest to, że ten pierwszy umożliwia umieszczenie sekwencji zdarzeń w kolejce. Dzięki keybd_event możesz umieszczać zdarzenia w kolejce po kolei i możliwe jest, że twoje sfałszowane wydarzenia mogą przeplatać się z rzeczywistymi zdarzeniami. I ten problem jest jednym z głównych powodów, dla których wprowadzono SendInput.

+1

Delphi ignoruje informacje o kodzie skanowania, np. Generując zdarzenie "OnKeyDown". Jeśli ktoś potrzebuje wyodrębnić kluczowe kody skanowania, powinien bezpośrednio obsługiwać odpowiednie komunikaty systemu Windows (np. WM_KEYDOWN). – kludg

+0

Dzięki. Podam [SendInput] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310) i [P/Invoke SendInput] (http://www.pinvoke.net/default. aspx/user32.sendinput) strzał. Wrócę później. –