Seite 1 von 2

PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Verfasst: 03.10.2010 20:55
von PureLust
Folgender Code läuft bei mir unter Win7-64Bit mit PB 4.51-x86 einwandfrei.
Kompiliere ich ihn jedoch mit PB 4.51-x64, wird das Fenster sofort geschlossen.

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
Repeat
  event = WaitWindowEvent()
Until GetAsyncKeyState_(#VK_ESCAPE)
Strange. :freak:

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 21:03
von STARGÅTE
Das ist doch aber API ... Was hat PB damit zu tun ?

Lösung, einfach PB nutzen:

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1)
Repeat
  event = WaitWindowEvent()
Until event = #PB_Event_Menu And EventMenu() = 1

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 21:04
von edel
Kann ich jetzt nicht nachvollziehen, aber probier mal folgendes

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
Repeat
    event = WaitWindowEvent()
    
Until event = #WM_KEYDOWN And EventwParam() = #VK_ESCAPE

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 21:15
von Fluid Byte
Klassiker. Diese Funktion gibt kein BOOLEAN zurück sondern eine Bitmask.

So sollte es gehen.

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
Repeat
  event = WaitWindowEvent()
Until GetAsyncKeyState_(#VK_ESCAPE) & 1

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 21:42
von PureLust
Fluid Byte hat geschrieben:GetAsyncKeyState_(#VK_ESCAPE) & 1]
Jupp, das war's wohl (zumindest was das ungewollte Beendet des Progs angeht). :allright:

Trotzdem irgendwie seltsam dass es bei x86 und x64 unterschiedliche Ergebnisse gibt.
Bei meines System ist nach dem Programmstart mit x86 der erste GetAsyncKeyState() = 0, mit x64 ist der erste GetAsyncKeyState() = -6047248613376.
Evtl. irgendwelche Stacks nicht korrekt geleert? :roll:

Getestet mit:

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
Repeat
  event = WaitWindowEvent()
  Keystate.i = GetAsyncKeyState_(#VK_ESCAPE)
  Debug Keystate
Until GetAsyncKeyState_(#VK_ESCAPE)
(In der Debugausgabe dann ganz nach oben scrollen, um den ersten Eintrag zu sehen.)

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 21:50
von Thorium
PureLust hat geschrieben:
Fluid Byte hat geschrieben:GetAsyncKeyState_(#VK_ESCAPE) & 1]
Jupp, das war's wohl (zumindest was das ungewollte Beendet des Progs angeht). :allright:

Trotzdem irgendwie seltsam dass es bei x86 und x64 unterschiedliche Ergebnisse gibt.
Bei meines System ist nach dem Programmstart mit x86 der erste GetAsyncKeyState() = 0, mit x64 ist der erste GetAsyncKeyState() = -6047248613376.
Evtl. irgendwelche Stacks nicht korrekt geleert? :roll:

Getestet mit:

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"Test")
Repeat
  event = WaitWindowEvent()
  Keystate.i = GetAsyncKeyState_(#VK_ESCAPE)
  Debug Keystate
Until GetAsyncKeyState_(#VK_ESCAPE)
(In der Debugausgabe dann ganz nach oben scrollen, um den ersten Eintrag zu sehen.)
Fluid Byte hat das schon richtig erkannt.
Auch bei x86 ist dein Code nicht zuverlässig.
Der Rückgabewert enthält nämlich 2 angaben. Einmal ob die Taste gerade gedrückt ist und ob die Taste seid dem letzten Aufruf von GetAsyncKeyState gedrückt wurde. Das du unterschiedliche Werte zwischen x64 und x86 bekommst ist auch klar, da hier nur das höchstwertige und das niederwertigste Bit gesetzt bzw. gelöscht werden und der Rückgabewert unter x64 ein QuadWord und unter x86 ein DoubleWord ist.

Lies dir einfach mal die Beschreibung in der MSDN durch: http://msdn.microsoft.com/en-us/library/ms646293.aspx
Und wirf auch ein Auge auf die Remarks Sektion, es gibt bei der Funktion nämlich einiges zu beachten.

Re: PB x64 / Win7-64Bit - Problem mit GetAsyncKeyState_()

Verfasst: 03.10.2010 22:08
von PureLust
Vielen Dank für die Erklärung und die Infos. :allright:

Re: PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Verfasst: 25.10.2010 13:50
von Tombi
Irgendwo meine ich gelesen zu haben, das man diesen Befehl nicht nutzen sollte,
sondern einen anderen API-Befehl... :?

Re: PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Verfasst: 25.10.2010 20:23
von Fluid Byte
So präzise wollten wir es gar nicht wissen :)

Re: PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Verfasst: 25.10.2010 20:31
von TomS
Kann ja wohl nur im gleichen Zusammenhang, wie dieser Thread hier gewesen sein. Nämlich, dass die Benutzung, wie man sie häufig im CodeArchiv und eben auch in diesem Thread findet falsch ist.

Ich glaube in einem der zahlreichen Antivirus-Falschmeldungen-Threads, hat jemand gesagt, dass AntiViren-Programme gerne pauschal drauf losballern, sobald sie die Benutzung dieses Befehls entdecken, weil er von Keyloggern verwendet wird.

Naja, wie es anders geht, kannst du ja oben sehen.