Tastendrücke per Keyboard-Hook an andere Tasten weiterleiten
Verfasst: 26.11.2009 16:38
Hallo,
ich habe folgendes Problem.
Ich spiele derzeit ein Onlinespiel bei dem man leider nur mit Pfeiltasten laufen kann (interne die Steuerung umstellen geht hier nicht).
Da ich aber nunmal ein eingefleischter Zocker bin und w,a,s,d die Standardbelegung ist (und damit das Schreiben und benutzen von Hotkeys per F-Tasten einfacher ist) habe ich vor einen Keyboard-Hook
auf diese Tasten zu setzen und wenn diese gedrückt sind, sie an die jeweilige Pfeiltaste weiterzuleiten. Ich benutze also W und gesendet wird an Windows "Pfeiltaste-Hoch".
Folgenden Code aus dem Archiv auf PureArea habe ich gefunden:
funktioniert prima, W lässt sich hooken aber ich bin nunmal ein Anfänger in diesem Bereich und deshalb die Frage:
Welche Befehle brauche ich nun um stattdessen "Pfeiltaste-Hoch" zu senden?
Da ich keine Ahnung habe wie der Befehl lautet den man hier benutzen müsste kann ich auch meine Lösungsidee, die ohnehin nicht klappen wird, nicht testen.
Diese wäre nach dem gesetzen Hook die Taste zu überprüfen und stattdessen eben die jeweilige Pfeiltaste zu senden... in etwa
ich geh aber nun mal schwer davon aus, dass sich nach gesetzem Hook das überhaupt noch so überprüfen lässt.
Hat jemand eine Idee oder kann mir Tipps geben?
Vielen Dank im voraus,
Rubiko
ich habe folgendes Problem.
Ich spiele derzeit ein Onlinespiel bei dem man leider nur mit Pfeiltasten laufen kann (interne die Steuerung umstellen geht hier nicht).
Da ich aber nunmal ein eingefleischter Zocker bin und w,a,s,d die Standardbelegung ist (und damit das Schreiben und benutzen von Hotkeys per F-Tasten einfacher ist) habe ich vor einen Keyboard-Hook
auf diese Tasten zu setzen und wenn diese gedrückt sind, sie an die jeweilige Pfeiltaste weiterzuleiten. Ich benutze also W und gesendet wird an Windows "Pfeiltaste-Hoch".
Folgenden Code aus dem Archiv auf PureArea habe ich gefunden:
Code: Alles auswählen
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1693&highlight=hook
; Author: ChaOsKid
; Date: 17. July 2003
; Example for filtering "Strg-Z" from input in an EditorGadget
#Window = 0
#Gadget_Editor = 0
#Gadget_Button_Hook = 1
#Gadget_Button_Exit = 2
#WindowWidth = 600
#WindowHeight = 300
#minWindowWidth = 100
#minWindowHeight = 50
Global hook.l
Procedure OpenMainWindow()
Result = OpenWindow(#Window, 0, 0, #WindowWidth, #WindowHeight, "Strg+Z Hook", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
If Result
If CreateGadgetList(WindowID(#Window))
EditorGadget(#Gadget_Editor, 10, 10, #WindowWidth - 20, #WindowHeight - 60)
ButtonGadget(#Gadget_Button_Hook, 10, WindowHeight(#Window) - 40, 120, 30, "Hook Einschalten")
ButtonGadget(#Gadget_Button_Exit, WindowWidth(#Window) - 70, WindowHeight(#Window) - 40, 60, 30, "Exit")
EndIf
EndIf
ProcedureReturn Result
EndProcedure
;
Procedure WindowCallback(WindowID, Message, wParam, lParam)
Select Message
Case #WM_SIZE
If WindowWidth(#Window) < #minWindowWidth Or WindowHeight(#Window) < #minWindowHeight
If WindowWidth(#Window) < #minWindowWidth
ResizeWindow(#minWindowWidth, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
EndIf
If WindowHeight(#Window) < #minWindowHeight
ResizeWindow(#Window, 0, 0, WindowWidth(#Window), #minWindowHeight)
EndIf
Else
ResizeGadget(#Gadget_Editor, -1, -1, WindowWidth(#Window) - 20, WindowHeight(#Window) - 60)
ResizeGadget(#Gadget_Button_Hook, -1, WindowHeight(#Window) - 40, -1, -1)
ResizeGadget(#Gadget_Button_Exit, WindowWidth(#Window) - 70, WindowHeight(#Window) - 40, -1, -1)
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;
Procedure.l KeyboardHook(nCode.l, wParam.l, lParam.l)
If nCode < 0
ProcedureReturn CallNextHookEx_(hook, nCode, wParam, lParam)
EndIf
If wParam = 87
; Debug RSet(Bin(lParam), 32,"0")
; Debug "HOOKED"
ProcedureReturn 1
ProcedureReturn CallNextHookEx_(hook, nCode, wParam, lParam)
EndProcedure
;
If OpenMainWindow()
SetWindowCallback(@WindowCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_Button_Hook
If Aktiv ; aktiv dann ausschalten
UnhookWindowsHookEx_(hook)
; Debug "HOOK AUS"
Aktiv = 0
SetGadgetText(#Gadget_Button_Hook, "Hook Einschalten")
Else ; hook einschalten
hInstance = GetModuleHandle_(0)
lpdwProcessId = GetWindowThreadProcessId_(WindowID(#Window), 0)
hook = SetWindowsHookEx_(#WH_KEYBOARD, @KeyboardHook(), hInstance, lpdwProcessId)
; Debug "HOOK AN"
Aktiv = 1
SetGadgetText(#Gadget_Button_Hook, "Hook Ausschalten")
EndIf
Case #Gadget_Button_Exit
quit = 1
; Case #Gadget_Editor
EndSelect
Case #PB_Event_CloseWindow
quit = 1
EndSelect
Until quit
EndIf
If Aktiv
UnhookWindowsHookEx_(hook)
; Debug "HOOK ausschalten nicht vergessen !"
EndIf
End
; ExecutableFormat=Windows
; FirstLine=1
; EnableXP
; EOF
Welche Befehle brauche ich nun um stattdessen "Pfeiltaste-Hoch" zu senden?
Da ich keine Ahnung habe wie der Befehl lautet den man hier benutzen müsste kann ich auch meine Lösungsidee, die ohnehin nicht klappen wird, nicht testen.
Diese wäre nach dem gesetzen Hook die Taste zu überprüfen und stattdessen eben die jeweilige Pfeiltaste zu senden... in etwa
Code: Alles auswählen
; Pseudocode
...
If wParam = 87
ProcedureReturn 1
If GetAsyncKeyState_(#VK_W)
SendKey(#VK_ARROW_UP)
Endif
...
Hat jemand eine Idee oder kann mir Tipps geben?
Vielen Dank im voraus,
Rubiko