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?!
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??
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.
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!
c ya,
nco2k