Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

getasynckeystate_problem

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 11.09.2008, 23:22    Titel: getasynckeystate_problem Antworten mit Zitat

Hey,
Ich habe ein Programm geschrieben, das im Hintergrund läuft und dann mittels einer Tastenkombination Programme aufruft.
Mein Problem ist es, dass es manchmal anscheinend willkürlich Tasten "erkennt" und dann Programme startet, als ob irgendein Puffer noch Daten enthält.

Code:

#define VK_RETURN   13
#define VK_CONTROL  17
#define VK_MENU     18
#define VK_DELETE   46

#define VK_F1 &h70

#define VK_C &H43

declare function WinExec lib "kernel32" alias "WinExec" (byval as zstring ptr, byval as integer) as integer
declare function GetAsyncKeyState lib "user32.dll" alias "GetAsyncKeyState" (byval as integer) as SHORT

dim as integer status=0
do
    if getasynckeystate(vk_control) and getasynckeystate(vk_menu) then
        if getasynckeystate(vk_c) or getasynckeystate(vk_delete) then'close
            end
        elseif getasynckeystate(vk_f1) then'hilfe
            if status<>1 then status=1:'sub hilfe wird aufgerufen
        elseif getasynckeystate(vk_return) then'ProcessExplorer
            if status<>2 then status=2:winexec(curdir$+"PortableApps\ProcessExplorer\procexp.exe",1)
        else
            status=0
        end if
    else
        status=0
    end if
    sleep 1
loop


So sieht das Programm aus.
Es hat noch mehr Abfragen, aber alle nach dem gleichen Schema.

Nach einigem rumprobieren habe ich nun eine reproduzierbaren Fall:
Zum Beenden des Programmes habe ich u.a strg+alt+c festgelegt.
Drücke ich diese Tastenkombination nun mehrfach und führe dann das Programm aus schließt es sich häufig sofort wieder.


Ich benutze die Version 0.20.0 vom 10.8.08


Vllt gibt es ja tatsächlich einen Speicher den ich am Ende der Schleife, bzw vor der Schleife löschen kann, damit dieses Problem nicht mehr auftritt.


mfg noop

Edit:
bevor ich es überhaupt abgeschickt hab^^
vergessen auf absenden zu klicken...grad nen Einfall gehabt und mal ausprobiert.
Ich habe eine "debuffer" sub hinzugefügt.
Mein reproduzierbaren "Fehler" gibt es nun nicht mehr.
Vllt war dies wirklich die Lösung.
Ich verstehe bloß nicht so ganz warum es so ist~~

Code:

#define VK_RETURN   13
#define VK_CONTROL  17
#define VK_MENU     18
#define VK_DELETE   46

#define VK_F1 &h70

#define VK_C &H43

declare function WinExec lib "kernel32" alias "WinExec" (byval as zstring ptr, byval as integer) as integer
declare function GetAsyncKeyState lib "user32.dll" alias "GetAsyncKeyState" (byval as integer) as SHORT

declare sub debuffer
dim as integer status=0
debuffer
do
    if getasynckeystate(vk_control) and getasynckeystate(vk_menu) then
        if getasynckeystate(vk_c) or getasynckeystate(vk_delete) then'close
            end
        elseif getasynckeystate(vk_f1) then'hilfe
            if status<>1 then status=1:'sub hilfe wird aufgerufen
        elseif getasynckeystate(vk_return) then'ProcessExplorer
            if status<>2 then status=2:winexec(curdir$+"PortableApps\ProcessExplorer\procexp.exe",1)
        else
            status=0
        end if
    else
        status=0
    end if
    sleep 1
    debuffer
loop

sub debuffer
    dim as integer key,result
    for key=1 to 255
        result=getasynckeystate(val("&h"+hex(key)))
    next key
end sub
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 16.09.2008, 06:54    Titel: Antworten mit Zitat

Code:
VAL("&h"+HEX(key))


Warum nicht einfach "key"? durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 16.09.2008, 15:14    Titel: Antworten mit Zitat

(5*4+0)/4 ist doch was anderes als 5?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 17.09.2008, 12:44    Titel: Antworten mit Zitat

Weil es so in irgendeiner referenz stand^^
Das &h lediglich für die Umwandlung von hex benötigt wird war mir entfallen.
Also hab ich es einfach so hingeschrieben wie es dort steht.

So jetzt hatte ich mal wieder Zeit mich dem Problem zu widmen:

Zitat:

[...]if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.


Ich glaube dort liegt das Problem:
Verstehe ich das richtig, dass 1 zurückgegeben wird?
LSB=1
MSB=(2^15)-1
Stimmt das so?

Das würde erklären warum das Programm sich beendet hat.
Weil 1 true liefert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 17.09.2008, 15:54    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:
(5*4+0)/4 ist doch was anderes als 5?


Nein. 5 * 4 = 20; 20 + 0 = 20; 20 / 4 = 5 --> (5*4+0)/20 = 5.

Btw - MSB = 2^15, nicht (2^15)-1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 17.09.2008, 16:30    Titel: Antworten mit Zitat

Btw. die Funktion WinExec() ist aaaalt, seeehr aaaaalt. Die soll es im nächsten WinDOS gar nicht mehr geben zwinkern (kommt noch aus 16-Bit Zeiten)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 17.09.2008, 16:39    Titel: Antworten mit Zitat

das haben sie schon bei vielen funktionen gesagt, dass die nicht mehr vorhanden seien. und doch sind sie noch da happy und gerade diese alten funktionen sind manchmal noch echt nützlich (z.B. fürs 4k-coding).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 17.09.2008, 20:03    Titel: Antworten mit Zitat

Fürs produktive programmieren sollte man sich zumindest weitgehend an die Empfehlungen halten bzw. die "moderneren" Alternativen verwenden.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 18.09.2008, 20:38    Titel: Antworten mit Zitat

jo ich habe es mittlerweile in shellexecute geändert zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz