Seite 2 von 2

Verfasst: 10.11.2004 17:56
von real
Bei Windows-Programmen funktioniert das keybd_event natürlich. Aber wenn ich innerhalb eines Spiels, das über DirectInput seine Tasteninformationen bezieht eine Taste simuliere wird diese nicht erkannt. Also dachte ich daran, die LowLevelKeyboardProc zu manipulieren.

Verfasst: 10.11.2004 18:00
von NicTheQuick
Achso, das sollte man natürlich wissen. Aber da habe ich momentan keine Ahnung, wie man das machen könnte.
Tut mir Leid...

Verfasst: 20.11.2004 11:18
von real
Sorry, Falschaussage: Auch unter DirectInput kann man einen Tastendruck simulieren...

Code: Alles auswählen

If *p\vkCode = #VK_LWIN
  keybd_event_($4D, MapVirtualKey_($4D,0), 0, 0)
  keybd_event_($4D, MapVirtualKey_($4D,0), #KEYEVENTF_KEYUP, 0)
  ProcedureReturn 1
EndIf
:D

Verfasst: 19.12.2004 23:19
von Agent
Dazu eine Frage:

Wie kann ich denn in der oberen mykeyboardhook-procedure abfangen, wenn jemand z.b. STRG-V drückt?

Mit

If *p\vkCode = #VK_LCONTROL And *p\vkCode = #VK_V...

geht es jedenfalls nicht.

Kurz und gut: Wie soll das mit Tasten-Kombinationen funktionieren?

Verfasst: 21.12.2004 18:24
von real
Versuch mal:

Code: Alles auswählen

If ((*p\vkCode = #VK_V) And (GetKeyState_(#VK_CONTROL) & $8000))
...
Gruß
René

Verfasst: 21.12.2004 20:31
von Agent
Hm...

für was ist denn die $8000???? (hex ist klar, aber 8000)

Verfasst: 21.12.2004 20:32
von Agent
ah....


noch gedrückt.... kann das sein?

Verfasst: 22.12.2004 17:07
von real
"The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled (on, off - alternating each time the key is pressed)."

schau dir mal die infos im netz zum getkeystate an...

Verfasst: 26.03.2008 19:58
von R4z0r1989
*buddel* *ausgrab*

warum spert mein Code nicht F1 bis F12???

Code: Alles auswählen

; by Danilo, 07.04.2003 - german forum 
; 
Global hWindow,msg,hook

Structure KBDLLHOOKSTRUCT 
  vkCode.l 
  scanCode.l 
  flags.l 
  time.l 
  dwExtraInfo.l 
EndStructure 

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT) 
   If nCode = #HC_ACTION 
      If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP 
         #LLKHF_ALTDOWN = $20 
         If *p\vkCode => #VK_F1 And *p\vkCode <= #VK_F12 ; F1 - F12 sperren!! 
            If *p\vkCode = #VK_F12 
              msg = 1
            EndIf
            ProcedureReturn 1 
         EndIf 
       EndIf 
    EndIf 
ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p) 
EndProcedure 

Procedure AskForExit() 
  If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES 
     UnhookWindowsHookEx_(hook) : End 
  EndIf 
EndProcedure 

; Win NT 
#WH_KEYBOARD_LL = 13 
hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0) 
If hook = 0: End: EndIf


Repeat 
  
  If msg = 1
    MessageRequester("lol","geht ned")
    AskForExit()
    msg = 0
  EndIf
  
ForEver
Edit: Warum verlangsamt mein Code auch noch die Tasta?
gibt es überhaupt eine möglichkeit es elegant ohne fenster zu lösen?

Verfasst: 26.03.2008 21:28
von Fluid Byte

Code: Alles auswählen

Structure KBDLLHOOKSTRUCT
	vkCode.l
	scanCode.l
	flags.l
	time.l
	dwExtraInfo.l
EndStructure 

Procedure KeyboardLLProc(nCode,wParam,*kbdhs.KBDLLHOOKSTRUCT)
	If nCode = #HC_ACTION And *kbdhs\vkCode >= #VK_F1 And *kbdhs\vkCode <= #VK_F12
		ProcedureReturn 1
	EndIf
	
	ProcedureReturn CallNextHookEx_(0,nCode,wParam,*kbdhs)
EndProcedure

hhkKeyboardLL = SetWindowsHookEx_(#WH_KEYBOARD_LL,@KeyboardLLProc(),GetModuleHandle_(0),0)

OpenWindow(0,0,0,320,240,"void",#WS_VISIBLE)

AddSysTrayIcon(0,WindowID(0),LoadImage(0,#PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico"))

Repeat
	EventID = WaitWindowEvent()
	
	If EventID = #PB_Event_SysTray And  EventType() = #PB_EventType_RightClick
		CreatePopupMenu(0)
		MenuItem(0,"Exit Keyboard Hook")
		DisplayPopupMenu(0,WindowID(0))
	EndIf
	
	If EventID = #PB_Event_Menu
		UnhookWindowsHookEx_(hhkKeyboardLL) : End
	EndIf
ForEver