Seite 1 von 1

(WinAPI) Frage zu GetAsyncKeyState_()

Verfasst: 26.10.2004 05:20
von nco2k
hi folks,

ich bräuchte einen WinAPI ersatz für KeyboardReleased()

sowas sollte doch auch mit GetAsyncKeyState_() ebenfalls möglich sein, oder ?!

c ya,
nco2k

Verfasst: 02.11.2004 09:57
von nco2k
kann mir da keiner helfen?! :cry:

c ya,
nco2k

Verfasst: 02.11.2004 10:22
von Danilo
Für WinGUI-Programme macht man das über Events, also
im Callback. WM_KEYDOWN, WM_KEYUP etc..

Wenn Du nicht genau sagst was Du vorhast, kann man auch
kein Beispiel geben. Sowas passt man halt an die jeweiligen
Anforderungen an.

Verfasst: 02.11.2004 10:24
von nco2k
das problem ist, ich brauche es für ein nicht gui programm und da scheint GetAsyncKeyState_() sehr gut zu funktionieren. hätte ich dazu schreiben sollen sorry.

edit: ich möchte einfach aus diversen gründen, die winapi benützen anstelle von ExamineKeyboard() deswegen will ich KeyboardPushed() & KeyboardReleased() "nachbauen". KeyboardPushed() kann ich ja mittels GetAsyncKeyState_() And $80000000 und $80000001 nachbauen, nur bei KeyboardReleased() komme ich nicht weiter. ich habs so gelöst bis jetzt if GetAsyncKeyState_() = 1 aber das scheint nicht immer zu wollen, wie folgendes beispiel zeigt:

Code: Alles auswählen

#Title = "Test"
hWnd = OpenWindow(0,0,0,640,480,#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered,#Title)
If InitSprite() = #False Or OpenWindowedScreen(hWnd,0,0,WindowWidth(),WindowHeight(),0,0,0) = #False
  End
EndIf

Repeat
  
  Event.l = WaitWindowEvent()
  
  If GetAsyncKeyState_(#VK_SNAPSHOT) = 1
    GrabSprite(0,0,0,WindowWidth(),WindowHeight())
    If FileSize("C:\"+#Title) <> -2
      CreateDirectory("C:\"+#Title)
    EndIf
    Number = 1
    While FileSize("C:\"+#Title+"\"+#Title+Str(Number)+".bmp") <> -1
      Number + 1
    Wend
    SaveSprite(0, "C:\"+#Title+"\"+#Title+Str(Number)+".bmp")
    FreeSprite(0)
  ElseIf (GetAsyncKeyState_(#VK_ESCAPE) And $80000001)
    End
  EndIf
  
Until Event = #PB_Event_CloseWindow

End
das wichtigste ist, daß es auch unter nicht gui programmen einsetzbar ist.

c ya,
nco2k

Verfasst: 04.11.2004 08:49
von nco2k
hmm... das ganze scheint problematischer zu sein, als ich zuerst dachte.

selbst bei den normalen abfragen, scheint es net ganz problemlos zu laufen.

Code: Alles auswählen

Repeat
  If ((GetAsyncKeyState_(#VK_LMENU) & $80000000) Or (GetAsyncKeyState_(#VK_RMENU) & $80000000))
    If (GetAsyncKeyState_(#VK_RETURN) & $80000001)
      Debug "TEST 1"
    EndIf
  ElseIf If ((GetAsyncKeyState_(#VK_LMENU) & $80000000) Or (GetAsyncKeyState_(#VK_RMENU) & $80000000)) And (GetAsyncKeyState_(#VK_F4) & $80000001)
    Debug "TEST 2"
  ElseIf (GetAsyncKeyState_(#VK_ESCAPE) & $80000001)
    End
  EndIf
ForEver

End
wenn ich zuerst die enter-taste drücke und dann die alt-taste, bekomme ich trotzdem ein event zurück. das selbe gilt bei alt+f4 und das sollte ja nicht sein. woran liegt das?! wie kann ich das beheben?? :cry:

c ya,
nco2k

Verfasst: 04.11.2004 15:46
von Mischa
Nun, Du mußt die Abfrage in Etappen gestalten, um
eine Tasten-Reihenfolge zu erzwingen.

Betrachte den Main-Loop Rückwärts:

-Kontrolle ob Return/F4 NICHT aber ALT(Gr) schon gedrückt wird.
-Wenn ja (altpressed=1) -> Feinkontrolle
-Im letzten Schritt (keystate<>0) Tasten-Release abwarten

Ach ja, es ist notwendig vor den Tasten-Kontrollen den
Tastaturpuffer zu leeren. :wink:

Code: Alles auswählen

Repeat
  If keystate
    If GetAsyncKeyState_(keystate)=0
      keystate=0
      Debug "(released)" 
    EndIf
  ElseIf altpressed
    If GetAsyncKeyState_(#VK_MENU)
      If GetAsyncKeyState_(#VK_RETURN)
        keystate=#VK_RETURN
        Debug "Alt + Return"
      ElseIf GetAsyncKeyState_(#VK_F4)
        keystate=#VK_F4
        Debug "Alt + F4"
      EndIf
    Else
      altpressed=0  
    EndIf
  Else
    ;Tastaturpuffer leeren
    GetAsyncKeyState_(#VK_MENU)
    GetAsyncKeyState_(#VK_ESCAPE)
    GetAsyncKeyState_(#VK_RETURN)
    GetAsyncKeyState_(#VK_F4)
    
    If GetAsyncKeyState_(#VK_RETURN)=0 And GetAsyncKeyState_(#VK_F4)=0 And GetAsyncKeyState_(#VK_MENU)
      altpressed=1
    ElseIf GetAsyncKeyState_(#VK_ESCAPE)
      End 
    EndIf
  EndIf 
ForEver
Gruß,
Mischa

Verfasst: 04.11.2004 18:30
von nco2k
danke! :wink:

c ya,
nco2k