PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

PB x86/x64 - Unterschied bei GetAsyncKeyState_()

Beitrag 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:
Zuletzt geändert von PureLust am 03.10.2010 22:17, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

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

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

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

Beitrag 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.)
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

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

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

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

Beitrag von PureLust »

Vielen Dank für die Erklärung und die Infos. :allright:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

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

Beitrag von Tombi »

Irgendwo meine ich gelesen zu haben, das man diesen Befehl nicht nutzen sollte,
sondern einen anderen API-Befehl... :?
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

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

Beitrag von Fluid Byte »

So präzise wollten wir es gar nicht wissen :)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

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

Beitrag 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.
Antworten