(WinAPI) Frage zu GetAsyncKeyState_()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

(WinAPI) Frage zu GetAsyncKeyState_()

Beitrag 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
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

kann mir da keiner helfen?! :cry:

c ya,
nco2k
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

danke! :wink:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Antworten