Tastaturabfrage ohne Screen nicht möglich?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Tastaturabfrage ohne Screen nicht möglich?

Beitrag 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() ?
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag von brotkasten-deluxe »

Damn ! Dumme Frage ich weis , habs nu gefunden :?
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag 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
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag von brotkasten-deluxe »

dh wenn ich jetzt mich in einem spiel befinde kann ich trotzdem den shortcut von einem anderen prog aufrufen(bzw diesem) ?
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag von brotkasten-deluxe »

Ok habs geschaft aber n neues problem ist entstanden : wie machen ich die 100 % Prozessorauslastung weg ?
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

hmm... wieso so Kompliziert wenn man auch GetAsyncKeyState_() nehmen kann. Und mit einem And kann man dann sogar Shortcuts machen.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Sollte man die Keyboad-Commandos nicht erst nutzen, wenn ein Screen geöffnet wird?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten