Wygląda na to, że jeśli zadzwonisz pod numer ToAscii()
lub ToUnicode()
podczas globalnego hakowania WH_KEYBOARD_LL i zostanie naciśnięty klawisz martwy, zostanie on "zniszczony".ToAscii/ToUnicode w haku klawiatury niszczy martwe klawisze
Załóżmy na przykład, że język konfiguracji został skonfigurowany w systemie Windows jako hiszpański i chcesz wpisać w programie akcentowaną literę á. Zwykle naciskasz przycisk pojedynczego cytowania (martwy klucz), a następnie literę "a", a następnie na ekranie zostanie wyświetlony akcentowany á, zgodnie z oczekiwaniami.
Ale to nie zadziała, jeśli zadzwonisz pod numer ToAscii()
lub ToUnicode()
w funkcję podnośnika klawiatury niskiego poziomu. Wygląda na to, że martwy klucz jest zniszczony, więc na ekranie nie pojawia się akcentowany list á. Usunięcie wywołania powyższych funkcji rozwiązuje problem ... ale niestety, muszę mieć możliwość wywoływania tych funkcji.
Przez kilka dni używałem Google'a i chociaż wiele osób miało ten problem, nie dostarczono dobrego rozwiązania.
Każda pomoc będzie bardzo ceniona!
EDIT: Dzwonię ToAscii()
do konwersji wirtualnego kod klucza i kodu skanowania odebrany w moim LowLevelKeyboardProc funkcji haka do otrzymanego znaku, który będzie wyświetlany na ekranie przez użytkownika.
Próbowałem MapVirtualKey(kbHookData->vkCode, 2)
, ale nie jest to "kompletne" funkcja jako ToAscii()
; na przykład, jeśli naciśniesz Shift + 2, otrzymasz "2", a nie "@" (lub dowolny inny Shift + 2 dla układu klawiatury/języka użytkownika).
ToAscii()
jest idealny ... aż do naciśnięcia przycisku martwego.
EDIT2: Oto funkcja hak, ze znaczenia informacji usunięte:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}
Proszę podać kod połączenia do ToUnicode(). Skąd masz parametr lpKeyState? – jdigital
@jdigital: Cóż, osobiście dzwonię do ToAscii, ale przeczytałem, że dzieje się również z ToUnicode. Moje wywołanie to zasadniczo ToAscii (kbHookData-> vkCode, kbHookData-> scanCode, GetKeyboardState(), & lpchar, 0) w funkcji przechwytywania WH_KEYBOARD_LL. Kiedy wywołanie ToAscii zwraca -1, oznacza to, że wciśnięty został klawisz martwy ... a martwy klucz jest "zniszczony", jak to wyjaśniłem powyżej. – 00010000
Usunąłem moją odpowiedź, była ona całkowicie niepoprawna w oparciu o założenie, że odwoływałeś się do funkcji c-runtime do konwersji łańcuchów, a nie Win32 apis do konwersji skanerów ... przepraszam. –