Tastaturabfrage ohne Screen nicht möglich?
- brotkasten-deluxe
- Beiträge: 147
- Registriert: 29.08.2004 01:43
- Wohnort: Germany
- Kontaktdaten:
Tastaturabfrage ohne Screen nicht möglich?
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() ?
- brotkasten-deluxe
- Beiträge: 147
- Registriert: 29.08.2004 01:43
- Wohnort: Germany
- Kontaktdaten:
- brotkasten-deluxe
- Beiträge: 147
- Registriert: 29.08.2004 01:43
- Wohnort: Germany
- Kontaktdaten:
Hi brotkasten-deluxe
Wenn es dir nichts ausmacht, dass DirectInput8 benutzt wird kannst du diesen Code von mir verwenden:
Gruß
Stefan
Wenn es dir nichts ausmacht, dass DirectInput8 benutzt wird kannst du diesen Code von mir verwenden:
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()
Stefan
- brotkasten-deluxe
- Beiträge: 147
- Registriert: 29.08.2004 01:43
- Wohnort: Germany
- Kontaktdaten:
- brotkasten-deluxe
- Beiträge: 147
- Registriert: 29.08.2004 01:43
- Wohnort: Germany
- Kontaktdaten:
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
...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:
Sollte man die Keyboad-Commandos nicht erst nutzen, wenn ein Screen geöffnet wird?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Laut Fred/Debugger: JaGPI hat geschrieben:Sollte man die Keyboad-Commandos nicht erst nutzen, wenn ein Screen geöffnet wird?
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck