Seite 1 von 2

Tastaturabfrage ohne Screen nicht möglich?

Verfasst: 01.02.2005 15:48
von brotkasten-deluxe
Wie kann ich abfragen dass ein Taste gedrückt wurde ohne ein screen erstellen zu müssen , weil bei mir kommt immer ein err0r beim ExamineKeyboard() ?

Verfasst: 01.02.2005 16:46
von brotkasten-deluxe
Damn ! Dumme Frage ich weis , habs nu gefunden :?

Verfasst: 01.02.2005 17:23
von brotkasten-deluxe
Aber mal ne andere Frage : warum kan ich AddKeyboardShortcut() nicht benutzen wenn das fenster invisible ist?
bzw wie kann ichs machn dass der shortkut immer zugreifbar bleibt egal ob in welchem programm man sich befindet

Verfasst: 01.02.2005 18:28
von Stefan
Hi brotkasten-deluxe

Wenn es dir nichts ausmacht, dass DirectInput8 benutzt wird kannst du diesen Code von mir verwenden: :wink:

Code: Alles auswählen

;==================== DInput8 part ================================
;
;==================================================================

#DISCL_BACKGROUND=8
#DISCL_NONEXCLUSIVE=2
#DISCL_EXCLUSIVE=1
#DISCL_FOREGROUND=4
#DISCL_NOWINKEY=16

Structure DIDEVICEINSTANCE 
  dwSize.l
  GuidInstance.guid
  GuidProduct.guid 
  dwDevType.l 
  tszInstanceName.b[#MAX_PATH]
  tszProductName.b[#MAX_PATH]
  guidFFDriver.guid
  wUsagePage.w
  wUsage.w
EndStructure

Structure DIOBJECTDATAFORMAT
  pguid.l
  dwOfs.l
  dwType.l
  dwFlags.l
EndStructure

Structure DIDATAFORMAT
  dwSize.l
  dwObjSize.l 
  dwFlags.l
  dwDataSize.l 
  dwNumObjs.l 
  rgodf.l
EndStructure

Global GuidInst
;Global DevName.s
Global Inst
Global *DInput.IDirectInput8A
Global *Device.IDirectInputDevice8A
Global Buffer1
Global Buffer2

Procedure DI8_FreeKeyboard()
  If GuidInst:GlobalFree_(GuidInst):EndIf
  If Buffer1:GlobalFree_(Buffer1):EndIf
  If Buffer2:GlobalFree_(Buffer2):EndIf
  If *Device:*Device\UnAcquire():*Device\Release():EndIf
  If *DInput:*DInput\Release():EndIf
  If Inst:FreeLibrary_(Inst):EndIf
EndProcedure

Procedure DInputCB(*DI.DIDEVICEINSTANCE,dummy)
  CopyMemory(*DI\GuidInstance,GuidInst,SizeOf(guid))
  ;DevName=PeekS(@*DI\tszInstanceName)
EndProcedure


Procedure DI8_InitKeyboard(WindowID)
  GuidInst=GlobalAlloc_(#GMEM_FIXED,16)
  If GuidInst=0:ProcedureReturn 0:EndIf
  
  DevTyp=3;Tastatur
  
  Inst=LoadLibrary_("Dinput8.dll")
  
  If Inst=0:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  Func=GetProcAddress_(Inst,"DirectInput8Create")
  If Func=0:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  CallFunctionFast(Func,GetClassLong_(WindowID,#GCL_HMODULE),$800,?DInput,@*DInput,0)
  
  If *DInput=0:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  *DInput\EnumDevices(DevTyp,@DInputCB(),0,0)
  
  *Device.IDirectInputDevice8A
  *DInput\CreateDevice(GuidInst,@*Device,0)
  
  If *Device=0:DI8_FreeKeyboard():ProcedureReturn 0:EndIf 
  
  Result=*Device\SetCooperativeLevel(WindowID,#DISCL_BACKGROUND|#DISCL_NONEXCLUSIVE)
  
  If Result:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  Dim Keys.DIOBJECTDATAFORMAT(255)
  
  A.DIDATAFORMAT
  A\dwSize=24
  
  A\dwObjSize=16
  A\dwFlags=2
  A\dwDataSize=256
  A\dwNumObjs=256
  A\rgodf=@Keys(0)
  
  G.guid
  G\data1=1433567776
  G\data2=-11460
  G\data3=4559
  G\data4[0]=-65
  G\data4[1]=-57
  G\data4[2]=68
  G\data4[3]=69
  G\data4[4]=83
  G\data4[5]=84
  G\data4[6]=0
  G\data4[7]=0
  
  For Nr=0 To 255
    Keys(Nr)\pguid=G
    Keys(Nr)\dwOfs=Nr
    Keys(Nr)\dwType=$8000000C+(Nr*256)
    Keys(Nr)\dwFlags=0
  Next
  
  Result=*Device\SetDataFormat(A)
  If Result:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  Dim Keys.DIOBJECTDATAFORMAT(0)
  Result=*Device\Acquire()
  If Result:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  Buffer1=GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,256)
  Buffer2=GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,256)
  
  If Buffer1=0 Or Buffer2=0:DI8_FreeKeyboard():ProcedureReturn 0:EndIf
  
  ProcedureReturn 1
  DataSection
  DInput:;GUID
  Data.b 48,-128,121,-65,58,72,-94,77,-86,-103,93,100,-19,54,-105,0
  EndDataSection
EndProcedure

Procedure DI8_ExamineKeyboard()
  CopyMemory(Buffer1,Buffer2,256)
  ProcedureReturn *Device\GetDeviceState(256,Buffer1)
EndProcedure

Procedure DI8_KeyUp(Key)
  Result=0
  If PeekB(Buffer1+Key)=0 And PeekB(Buffer2+Key)&$80:Result=-1:EndIf
  ProcedureReturn Result
EndProcedure

Procedure DI8_KeyDown(Key)
  Result=0
  If PeekB(Buffer1+Key)&$80 And PeekB(Buffer2+Key)=0:Result=1:EndIf
  ProcedureReturn Result
EndProcedure

Procedure DI8_KeyPushed(Key)
  Result=0
  If PeekB(Buffer1+Key)&$80:Result=1:EndIf
  ProcedureReturn Result
EndProcedure


;==================================================================
;
;==================================================================





flags=#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
OpenWindow(1,0,0,400,300,flags,"DirectInput8 test")         
CreateGadgetList(WindowID())
StringGadget(1,0,0,400,300,"",#PB_String_MultiLine|#WS_VSCROLL)

DI8_InitKeyboard(WindowID())

Repeat
  Event=WindowEvent()
  
  DI8_ExamineKeyboard()
  
  For C=1 To 238
    If DI8_KeyDown(C):SetGadgetText(1,GetGadgetText(1)+"Scancode: "+Str(C)+Chr(13)+Chr(10)):EndIf
  Next
  
  If DI8_KeyDown(#PB_Key_F1);#PB_Key_All wird nicht unterstützt !
    State=~State
    HideWindow(1,State)
  EndIf
  
Until Event=#PB_Event_CloseWindow

DI8_FreeKeyboard()
Gruß
Stefan

Verfasst: 01.02.2005 18:43
von brotkasten-deluxe
dh wenn ich jetzt mich in einem spiel befinde kann ich trotzdem den shortcut von einem anderen prog aufrufen(bzw diesem) ?

Verfasst: 01.02.2005 22:28
von brotkasten-deluxe
Ok habs geschaft aber n neues problem ist entstanden : wie machen ich die 100 % Prozessorauslastung weg ?

Verfasst: 01.02.2005 22:35
von Danilo

Code: Alles auswählen

If InitKeyboard()=0
  MessageRequester("Error","Cant initialize keyboard functions !"):End
EndIf

DisableDebugger ; disable debugger error checks for keyboard

Repeat
  Delay(10) ; CPU-Idle 10ms

  ; do something
  Beep_(800,20)

  ExamineKeyboard()
Until KeyboardPushed(#PB_KEY_ESCAPE)

Verfasst: 01.02.2005 22:41
von orange-blue
hmm... wieso so Kompliziert wenn man auch GetAsyncKeyState_() nehmen kann. Und mit einem And kann man dann sogar Shortcuts machen.

Verfasst: 01.02.2005 22:46
von GPI
Sollte man die Keyboad-Commandos nicht erst nutzen, wenn ein Screen geöffnet wird?

Verfasst: 01.02.2005 23:22
von Danilo
GPI hat geschrieben:Sollte man die Keyboad-Commandos nicht erst nutzen, wenn ein Screen geöffnet wird?
Laut Fred/Debugger: Ja
Laut DirectX: Nein

DirectInput ist in DX eine eigenständige Komponente. Kannst
Du auch ohne Screen verwenden, z.B. Joystick/pad -> Robotersteuerung
oder auch mit einem einfachen Fenster... und natürlich OpenGL.