Seite 1 von 2

Suche Tutorial für umgang mit GetAsyncKeyState

Verfasst: 27.04.2009 00:11
von Sunny
Also, wie's schon im Titel steht

Ich suche eben ein Tutorial oder sowas in der Art, wo erklärt wird wie man mit dem Befehl GetAsyncKeyState umgeht...

Allerdings suche ich keine Allgemeine Erklärung von Windows-API's sondern speziell für den gebrauch in PureBasic.

Verfasst: 27.04.2009 00:40
von Kaeru Gaman
ich bezweifle, dass es ein tut speziell für diesen Befehl gibt...

was willst du denn wissen? ich komm mit damit recht gut klar.

Verfasst: 27.04.2009 00:48
von ts-soft
Die API wird in PB eigentlich nur in Ausnahmefällen benötigt, für Spiele gibts
die KeyBoard Lib und für Fenster die KeyBoardShortcuts.
Hier mal ein Beispiel für so eine Ausnahme, nämlich Feststellen ob Shift
gedrückt ist, beim Buttonklick.

Code: Alles auswählen

OpenWindow(0, 0, 0, 200, 50, "void", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 180, 30, "test")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      GetAsyncKeyState_(#VK_SHIFT); erstmal alten Wert löschen
      
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftClick
              If GetAsyncKeyState_(#VK_SHIFT)
                Debug "Button + Shift gedrückt"
              Else

                Debug "Button gedrückt"
              EndIf
          EndSelect
      EndSelect
  EndSelect
ForEver
Im allgemeinen sollte man aber die besseren Alternativen nutzen, deshalb
macht ein Tutorial auch nicht so viel Sinn, da es ja nur in seltenen Fällen,
und dann eben zugeschnitten auf diese Fälle sein muß. Man sollte das
besser nur im Zusammenhang mit anderen Events nutzen.

Mein Ratschlag: Laß die Finger von dieser Funktion, wenn es andere
Lösungen gibt :mrgreen:

Gruß

Thomas

Verfasst: 27.04.2009 00:57
von Sunny
Ähm...
Naja, ich hab vorhin ein wenig rungefummelt und mal so mitbekommen, dass das gar nicht so schwer ist wie ich dachte...

ich hab nur noch 1 problem

1. was kann ich machen, damit der befehl nicht zu schnell reagiert wenn ich ne taste drücke... weil wenn ich dann mal kurz eine taste drücke, dann erkennt das programm das 4 mal und häufiger, wobei ich denke, dass der Befehl Delay da auch keine richtige lösung ist

ich hoffe ich hab mich nicht zu undeutlich ausgedrückt.

danke im voraus

Verfasst: 27.04.2009 00:59
von Kaeru Gaman
lass dir mal den Rückgabewert debuggen.
beim allerersten press ist das ein anderer wert als beim festhalten.
also, wenn du genau gegen den ersten wert prüfst, wird nur ein einziger tastendruck ausgewertet.

... aber grundsätzlich stimmt schon, was ts sagt: wenn möglich, die PB-eigenen libs benutzen.

Verfasst: 27.04.2009 01:25
von ts-soft
Sunny hat geschrieben: 1. was kann ich machen, damit der befehl nicht zu schnell reagiert wenn ich ne taste drücke... weil wenn ich dann mal kurz eine taste drücke, dann erkennt das programm das 4 mal und häufiger, wobei ich denke, dass der Befehl Delay da auch keine richtige lösung ist
Welche Art von Programm haste den?
GetAsyncKeyState_() löst immer 2 events aus, eins für Up und eins für Down
Entweder man löscht eins, wie in meinem ersten Beispiel, oder man wertet
nur eins aus: GetAsyncKeyState_(#VK_SHIFT) & $8000

Ohne EventLoop würde ich den Befehl garnicht nutzen, und mit, nur nachdem
ein anderes bestimmtes Ereignis aufgetreten ist, wie in meinem Beispiel.

Consolen und fensterlose Anwendungen sollten das lieber nicht nutzen!
Die sollten dann einen entsprechenden KeyBoardHook nutzen, aber das ge-
hört hier nicht her.

Verfasst: 27.04.2009 01:32
von Sunny
ich danke euch allen vielmals
das hat mir wirklich weitergeholfen

jetzt hab ich aber noch ne frage...
ich hab hier schon inner sufu nachgeschaut und auch schon nachgegoogelt aber nichts wirkliches gefunden

ich suche noch nach einer liste für sonderzeichen, wie z.b. ".", ",", "ä", "ö", "ü", "-", "#", usw...

weiß jemand wo ich sowas finde?

Verfasst: 27.04.2009 02:08
von ts-soft
Warum nimmste nicht #WM_CHAR

Code: Alles auswählen

OpenWindow(0, 0, 0, 200, 50, "void", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
      
    Case #WM_CHAR
      Debug Chr(EventwParam())
  EndSelect
ForEver

Verfasst: 27.04.2009 02:26
von Sunny
nun ja... ich würde mal behaupten, weil ich mit der ganzen sache mit tastenabfrage und so noch nich so ganz klar komme, ich wüsste z.b. nicht wie der code funktionieren soll ohne erst ein fenster zu öffnen

Verfasst: 27.04.2009 02:30
von ts-soft
> ich wüsste z.b. nicht wie der code funktionieren soll ohne erst ein fenster zu öffnen
Garnicht :mrgreen:
Sieht mir mal wieder nach nem Keylogger aus, da werde ich nicht helfen wollen :evil: