Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 11.09.2008, 23:22 Titel: getasynckeystate_problem |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 16.09.2008, 06:54 Titel: |
|
|
Warum nicht einfach "key"?  |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 16.09.2008, 15:14 Titel: |
|
|
(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 |
|
 |
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 17.09.2008, 12:44 Titel: |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 17.09.2008, 15:54 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 17.09.2008, 16:30 Titel: |
|
|
Btw. die Funktion WinExec() ist aaaalt, seeehr aaaaalt. Die soll es im nächsten WinDOS gar nicht mehr geben (kommt noch aus 16-Bit Zeiten) |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.09.2008, 16:39 Titel: |
|
|
das haben sie schon bei vielen funktionen gesagt, dass die nicht mehr vorhanden seien. und doch sind sie noch da 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 |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 17.09.2008, 20:03 Titel: |
|
|
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 |
|
 |
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 18.09.2008, 20:38 Titel: |
|
|
jo ich habe es mittlerweile in shellexecute geändert  |
|
Nach oben |
|
 |
|