Globale Tastenabfrage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Globale Tastenabfrage

Beitrag von sen-me »

Also ich willn prog schreiben und bin grad dran einstellungen zu proggen.
Das Programm läuft z.b. hinter spielen und kann screenshots und sowas machen.

nun wollt ich ne funktion machen, wenn man z.b. F9 drückt, kann man eine neue taste für screenshots festlegen.
aber wie frag ich ab welche tatse er danach (nach F9) drückt?
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Mit der Windows-API.
Dort gibt es den Befehl GetAsynckeyState_(). Funktioniert aber nicht mit der Demoversion von PB.

Mit GetAsynckeyState_() kannst du global, d. h. auch, wenn dein Fenster nicht den Fokus hat, oder dein Programm nicht mal ein Fenster hat :-D , ermitteln, ob eine Taste gedrückt wurde..

Und so wird's gemacht:

Code: Alles auswählen

Delay(1111) ; Zeit, damit du A gedrückt halten kannst
If GetAsyncKeyState_(#VK_A)
     Debug "A wurde gedrückt."
EndIf
Wenn die taste gedrückt wurde, wird ein Wert ungleich null zurückgegeben. Willst du zum Beispiel Strg+S abfragen, dann mach's einfach so:

Code: Alles auswählen

If GetAsyncKeyState_(#VK_SHIFT) And GetAsyncKeyState_(#VK_S)
     Debug "Zeit, zum Speichern..."
EndIf
Schau mal hier: http://msdn.microsoft.com/library/defau ... ystate.asp, um zu wisen, welche Virtual Keycodes es gibt, die du abfragen kannst.

Ich kann dir jetzt schon sagen, dass es folgende Virtuelle Keycodes gibt (gibt nactürlich noch mehr):
#VK_A
.
.
.
#VK_Z

#VK_0
.
.
.
#VK_9

#VK_F1
.
.
.
#VK_F12

#VK_RETURN
#VK_SHIFT
#VK_CTRL
#VK_ALT
#VK_SPACE
#VK_END
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

aber wie prüfe ich welche taste gedrückt wurde O.o
ohne 900 abfragen hinzuschreiben
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Bild
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Vielleicht hilft das dir ja weiter, hab ich mal gebastelt:

Code: Alles auswählen

Structure Key 
  Zeichen.s 
  Code.l 
  down.b
EndStructure 
NewList Key.Key() 

Procedure AddKey(Zeichen.s, Code.l) 
  AddElement(Key()) 
  Key()\Zeichen = Zeichen 
  Key()\Code = Code 
EndProcedure 

Procedure InitKeys() 
  ;Buchstaben von a bis z 
  AddKey("a", #VK_A) 
  AddKey("b", #VK_B) 
  AddKey("c", #VK_C) 
  AddKey("d", #VK_D) 
  AddKey("e", #VK_E) 
  AddKey("f", #VK_F) 
  AddKey("g", #VK_G) 
  AddKey("h", #VK_H) 
  AddKey("i", #VK_I) 
  AddKey("j", #VK_J) 
  AddKey("k", #VK_K) 
  AddKey("l", #VK_L) 
  AddKey("m", #VK_M) 
  AddKey("n", #VK_N) 
  AddKey("o", #VK_O) 
  AddKey("p", #VK_P) 
  AddKey("q", #VK_Q) 
  AddKey("r", #VK_R) 
  AddKey("s", #VK_S) 
  AddKey("t", #VK_T) 
  AddKey("u", #VK_U) 
  AddKey("v", #VK_V) 
  AddKey("w", #VK_W) 
  AddKey("x", #VK_X) 
  AddKey("y", #VK_Y) 
  AddKey("z", #VK_Z) 
  
  ;Zahlen von 1 bis 0 
  AddKey("1", #VK_1) 
  AddKey("2", #VK_2) 
  AddKey("3", #VK_3) 
  AddKey("4", #VK_4) 
  AddKey("5", #VK_5) 
  AddKey("6", #VK_6) 
  AddKey("7", #VK_7) 
  AddKey("8", #VK_8) 
  AddKey("9", #VK_9) 
  AddKey("0", #VK_0) 
  AddKey("1", #VK_NUMPAD1) 
  AddKey("2", #VK_NUMPAD2) 
  AddKey("3", #VK_NUMPAD3) 
  AddKey("4", #VK_NUMPAD4) 
  AddKey("5", #VK_NUMPAD5) 
  AddKey("6", #VK_NUMPAD6) 
  AddKey("7", #VK_NUMPAD7) 
  AddKey("8", #VK_NUMPAD8) 
  AddKey("9", #VK_NUMPAD9) 
  AddKey("0", #VK_NUMPAD0 ) 
  ;Sonderzeichen 
  AddKey("*", #VK_MULTIPLY) 
  AddKey(" ", #VK_SPACE) 
  AddKey("+",#VK_ADD)
  AddKey(",",188 )
  AddKey("-",#VK_SUBTRACT)
  AddKey("/",#VK_DIVIDE)
  AddKey("{F1}",#VK_F1)
  AddKey("{F2}",#VK_F2)
  AddKey("{F3}",#VK_F3)
  AddKey("{F4}",#VK_F4)
  AddKey("{F5}",#VK_F5)
  AddKey("{F6}",#VK_F6)
  AddKey("{F7}",#VK_F7)
  AddKey("{F8}",#VK_F8)
  AddKey("{F9}",#VK_F9)
  AddKey("{F10}",#VK_F10)
  AddKey("{F11}",#VK_F11)
  AddKey("{F12}",#VK_F12)
  AddKey(".",190)
  AddKey(":",446)
  AddKey("#",191)
  AddKey("ß",219)
EndProcedure 

Procedure.s GetKeyboardReleasedKey() 
  Zeichen.s=""
  ResetList(Key()) 
  Shift.l = #False 
  While NextElement(Key()) 
    If GetAsyncKeyState_(Key()\Code) & $80000000 
    ElseIf Key()\down
      Zeichen.s = Key()\Zeichen
    EndIf 
    If GetAsyncKeyState_(Key()\Code) & $80000000
      Key()\down=1
    Else
      Key()\down=0
    EndIf
  Wend 
  ProcedureReturn Zeichen 
EndProcedure 

InitKeys() 

Global Eingabe.s

start.l=GetTickCount_()
geb2=GetTickCount_()

CreateFile(1,"C:\program\starter\data\Afrikaans.lng")

Repeat

  new.s=GetKeyboardReleasedKey()
  If new.s
  Debug new
  new=""
  EndIf
  ForEver
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

Ich habe noch ein Problem

Code: Alles auswählen

Procedure GetKey(num.b)
 If num>=36 : num+76
 ElseIf num>=26 : num+22 ;<-- 35+22=57=#VK_9
 Else : num+65 : EndIf
 ProcedureReturn num
EndProcedure

key.b=35 ;Ziffer 9

Repeat
 For r.b=0 To 123 : GetAsyncKeyState_(r) : Next r ;Geht nur bis #VK_F12
 Sleep_(1)
 If GetAsyncKeyState_(#VK_CONTROL)=-32767 And GetAsyncKeyState_(GetKey(key))=-32767 : Break : EndIf
ForEver
End
Geht nicht
Wie kann ich abfragen ob beide Tasten gedrückt worden sind
Bild
sire
Beiträge: 10
Registriert: 25.11.2005 02:09

ALT-Codes

Beitrag von sire »

AND51 hat geschrieben: #VK_RETURN
#VK_SHIFT
#VK_CTRL
#VK_ALT
#VK_SPACE
#VK_END[/i]
Nicht ganz korrekt: Es gibt kein #VK_ALT, wie ich eben selber erstaunt festgestellt habe. Aber natürlich kann man auch die ALT-Tasten abfragen, die VK-Konstanten dazu heißen allerdings #VK_MENU bzw. #VK_LMENU und VK_RMENU.
Antworten