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