Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem z hookiem na klawiature


Rekomendowane odpowiedzi

Opublikowano

Witam, na samym starcie powiem że rozwiązanie tego problemu jest dla mnie bardzo ważne gdyż pisze program zamówiony przez kogoś za który dostane pieniądze więc prosiłbym o szczegółową pomoc i wytłumaczenie. Otóż mam skrypt na hooka klawiatury, wszystko PRAWIE pięknie działa poza tym że hook nie rozróżnia małych i dużych liter? I poza tym nie wykrywa też polskich znaków oraz znaków interpunkcyjnych typu ,.!? i cała ta reszta. Przypuszczam iż z polskimi znakami trzeba zrobić po prostu kombinacje znaków + ALT więc to jest mało istotne. Bardziej istotne jest to że hook nie odróżnia właśnie wielkości liter i znaków interpunktyjnych. No i na sam koniec nie wiem dla czego jeżeli nacisnę raz klawisz np. 'a' to wpisuje się on do zmiennej $szKeys 2 razy. Oto kod:

 

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
Global $szKeys
OnAutoItExitRegister("Cleanup")
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)


While 1
	ToolTip($szKeys, 0, 0)
	Sleep(10)
WEnd

Func EvaluateKey($cKey, $hFunc) ; ALT $LLKHF_ALTDOWN
	Switch $cKey
		Case 32 To 126
			$szKeys &= Chr($cKey)
	EndSwitch
EndFunc

Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
	EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"), DllStructGetData($tKEYHOOKS, "flags"))
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc
Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
EndFunc

Jak może koledzy zauważyli przy zwracaniu vkCode z hooka rozszerzyłem funkcję EvaluateKey tak żebym miał też w niej stan klawisza ALT jako parametr. Zaś w EvaluateKey mam switcha na wybrane przeze mnie klawisze (nazywam je pisanymi) I tutaj właśnie problem bo wciskam te klawisze a tu niezależnie od shifta bądź caps-locka i tak wychodzą duże litery. Kod oczywiście jest przerabiany z helpa w SciTe. Prosiłbym kolegów o pomoc gdyż zależy mi bardzo na zrealizowaniu tego żeby działało poprawnie. Poczytałem trochę na forum autoit o tym samym problemie lecz dowiedziałem się tylko że chodzi o sprawdzanie stanu klawisza shift / caps-lock za pomocą flagi WM_CHAR i funkcji TranslateMessage (???) lecz więcej nic tam nie napisano o tym że sposobie.

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

No to może @ref

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

@ref :O

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Trochę bez sensu pisać programy nie mając zbytnio pojęcia nawet o czymś tak głupim jak debuggowanie (no tak ale przecież tutaj nie ma błędów).

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
Global $szKeys
OnAutoItExitRegister("Cleanup")
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)


While 1
	If $szKeys <> "" Then MsgBox(0,"",$szKeys)
   			$szKeys = ""
	Sleep(10)
WEnd

Func EvaluateKey($cKey, $hFunc) ; ALT $LLKHF_ALTDOWN
			$szKeys &= $cKey
EndFunc

Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
	EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"), DllStructGetData($tKEYHOOKS, "flags"))
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc
Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
EndFunc

Odpal sobie ten kod i sprawdź jaką liczbę zwrócą znaki interpunkcyjne, może w końcu domyślisz się, że 32-126 to nie pełny zakres.

 

@edit:

Co do shifta to

http://www.autoitscript.com/forum/topic/97312-winapi-setwindowshookex-key-combinations/

Opublikowano

Właśnie rzecz w tym że polskie znaki nie zwracają żadnego kodu ;] Ewentualnie jest zwracany kod alta a po nim zwykłego klawisza.

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

I tak już przerobiłem temat do zamknięcia...

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...