GetKey + Taskmanager = 0

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Eingeproggt

Betreff: GetKey + Taskmanager = 0

BeitragSa, Jul 10, 2010 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Grüß euch!

Ich hab mal wieder so n typisches Problem für mich: Ein Problem das nur ich habe und für das ich keine Erklärung kenne...

BlitzBasic: [AUSKLAPPEN]
Print "Bitte Leertaste drücken"
Repeat
If GetKey()=32 Then
Print "GetKey -> Leertaste"
EndIf
If KeyHit(57) Then
Print "KeyHit -> Leertaste"
EndIf
Delay 50
Until KeyHit(1)
End


Macht mal folgendes:
-> Diesen Code ausführen (ob mit oder ohne Debug macht bei mir keinen Unterschied)
-> Den Taskmanager starten
-> Leertaste drücken (das Blitz-Fenster soll natürlich aktiv sein)

Auf meinem PC (*) funktioniert GetKey() nichtmehr nachdem der Taskmanager läuft - oder auch nur einmal gelaufen ist. Nachdem ich ihn beende liefert GetKey immernoch 0. Sprich die Meldung "GetKey -> Leertaste" wird beim Drücken der Leertaste nicht ausgegben. Nur ein Neustart meines Programms hilft.
Auf meinem Laptop sowie 2 BB'lern die mit mir freundlicherweise getestet haben gerade klappt alles wunderbar.

*)
Intel Core2Duo E7400 @2.8GHz
3.25MB RAM
Win XP SP3
DX 9.0c
NVidia GeForce GTS 250

Es kann mir nicht zufälligerweise jemand helfen? Sad
So Dinge wie PC neu gestartet oder Virenüberprüfung hab ich schon gemacht.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Holzchopf

Meisterpacker

BeitragSa, Jul 10, 2010 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Was passiert, wenn du mal
BlitzBasic: [AUSKLAPPEN]
Repeat
gk = GetKey()
If gk<>0
Print "GetKey: " +gk
EndIf
Delay 50
Until KeyHit(1)

ausführst?

Registriert GetKey überhaupt noch Tasten oder funktioniert nur die Leertaste nicht mehr?

Wird denn die KeyHit-Meldung noch angezeigt? Oder kommt gar keine Grafikausgabe mehr? Wenn gar nichts mehr kommt, könntest du mal statt Print einfach DebugLog ausprobieren...

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Eingeproggt

BeitragSa, Jul 10, 2010 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, es funktioniert lediglich GetKey nicht mehr. Und zwar mit keiner Taste.
Graphikausgabe passt alles, KeyHit auch und auch sonst alles was ich so benutze in meinem Programm.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Thunder

BeitragSa, Jul 10, 2010 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir geht, wenn ich Taskmanager gestartet und wieder beendet habe, die Getkey-Routine nicht mehr.

Intel Celeron-M 1,5 GHz
2048 MB RAM
WIN XP SP2
DX 9.0c
irgendein integrierter Grafikchip von Intel

ich nehme an, dass es an Windows XP liegt. BlitzUDP hatte damit auch Probleme, aber wenn ich mich recht erinnere nur auf Windows XP.


mfg Thunder

Edit: Mist, ich komme bei sowas immer durcheinander. Es geht, die GetKey-Routine nicht mehr. Ist jetzt editiert.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am So, Jul 11, 2010 17:44, insgesamt einmal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragSa, Jul 10, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir ehts ohne Probleme. Windows XP Pro SP3 .Net 3.0/2.5/2.0/1.5/1.0 DirectX9.0(Latest Web Install)

Lösungswege:
1. Umweg über GetAsyncKeyState schreiben
2. Wirklich alle Patches, Fixes, Service Packs usw installieren(bis auf Genuie, das zieht netterweise viele ressourcen)

Eingeproggt

BeitragSa, Jul 10, 2010 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das haut mich jetzt von den Socken dass bei Thunder so ein ähnlicher Fehler auftritt aber wieder ein anderer.
Nunja, hab ein wenig herum gespielt - besser gesagt von dir, Xaymar, ein bissi kopiert *hust*

Für KeyHit sieht die Alternative über GetAsynKeyState so aus:

BlitzBasic: [AUSKLAPPEN]
Const MAPVK_VSC_TO_VK=1
Function KeyHit(key)
If api_GetActiveWindow()<>SystemProperty("AppHWND") Then Return False
Local vk=api_MapVirtualKey(key,MAPVK_VSC_TO_VK)
Return api_GetAsyncKeyState(vk) Shl 31 Shr 31
End Function


Daraus nun ein getKey basteln fällt mir allerdings nicht leicht, die trivialen Änderungen hab ich mal gemacht und das kam dabei raus:

BlitzBasic: [AUSKLAPPEN]
Const MAPVK_VK_TO_CHAR=2
Function GetKey()
If api_GetActiveWindow()<>SystemProperty("AppHWND") Then Return False
Local vk
For i=0 To 255
vk=api_MapVirtualKey(i,MAPVK_VSC_TO_VK)
If api_GetAsyncKeyState(vk) Shl 31 Shr 31 Then
Return api_MapVirtualKey(vk,MAPVK_VK_TO_CHAR)
EndIf
Next
Return 0
End Function


Was während des Taskmanagers bei mir geht! Smile
Allerdings war der Ursprung meines Problems dass eigentlich die selbstgeschriebene Texteingabe nicht mehr funktionierte. Und da nun das richtige Zeichen zu kriegen ist nun um Ecken schwerer. Da mit dem obigen Code immer nur die Ascii-Codes der Großbuchstaben zurück geliefert werden.
Bevor ich nun anfange, die Umschalt-Tasten mit Keydown zu überprüfen und dementsprechend die Buchstaben rückrechne (was noch einfach wäre im Vergleich zu Sonderzeichen!) stelle ich auch gleich die Frage auf, wie ich herausfinden soll ob die Feststelltaste gedrückt ist?

Und bevor ihr mir diese Frage beantwortet stelle ich die Frage auf: Ist es diesen Aufwand überhaupt wert?
Ich sag jetzt einfach mal nein, weil dann erspar ich mir die Arbeit Rolling Eyes

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Xaymar

ehemals "Cgamer"

BeitragSa, Jul 10, 2010 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du damit was anfangen kannst:
http://www.geekpedia.com/KB122...-keys.html

Winapi funktion: GetKeyStateA(iKeyState)

Eingeproggt

BeitragSa, Jul 10, 2010 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, es war halt doch nur stupide Tipparbeit die ich mir mal angetan habe:

BlitzBasic: [AUSKLAPPEN]
Const KEY_CAPSLOCK=$14
Const KEY_NUMLOCK=$90
Const KEY_SCROLLLOCK=$91

Const MAPVK_VSC_TO_VK=1
Const MAPVK_VK_TO_CHAR=2
Function GetKey()
If api_GetActiveWindow()<>SystemProperty("AppHWND") Then Return False
Local vk,ascii,shift
For i=1 To 255
vk=api_MapVirtualKey(i,MAPVK_VSC_TO_VK)
If api_GetAsyncKeyState(vk) Shl 31 Shr 31 Then
ascii=api_MapVirtualKey(vk,MAPVK_VK_TO_CHAR)
;Key nun bekannt, genaues Zeichen ermitteln
;Alt Gr
If KeyDown(184) Then
If ascii=Asc("2") Then Return Asc("²")
If ascii=Asc("3") Then Return Asc("³")
If ascii=Asc("<") Then Return Asc("|")
If ascii=Asc("+") Then Return Asc("~")
If ascii=Asc("7") Then Return Asc("{")
If ascii=Asc("8") Then Return Asc("[")
If ascii=Asc("9") Then Return Asc("]")
If ascii=Asc("0") Then Return Asc("}")
If ascii=Asc("ß") Then Return Asc("\")
If ascii=Asc("Q") Then Return Asc("@")
EndIf
shift=False
If KeyDown(42) Or KeyDown(54) Then shift=Not shift
If api_GetKeyState(KEY_CAPSLOCK) Then shift=Not shift
If shift Then
;Umschalt
;If ascii=Asc("^") Then Return Asc("°")
If ascii=Asc("1") Then Return Asc("!")
If ascii=Asc("2") Then Return 34
If ascii=Asc("3") Then Return Asc("§")
If ascii=Asc("4") Then Return Asc("$")
If ascii=Asc("5") Then Return Asc("%")
If ascii=Asc("6") Then Return Asc("&")
If ascii=Asc("7") Then Return Asc("/")
If ascii=Asc("8") Then Return Asc("(")
If ascii=Asc("9") Then Return Asc(")")
If ascii=Asc("0") Then Return Asc("=")
If ascii=Asc("ß") Then Return Asc("?")
;If ascii=Asc("´") Then Return Asc("`")
If ascii=Asc("<") Then Return Asc(">")
If ascii=Asc(",") Then Return Asc(";")
If ascii=Asc(".") Then Return Asc(":")
If ascii=Asc("-") Then Return Asc("_")
If ascii=Asc("#") Then Return Asc("'")

;Umlaute
If ascii=Asc("ä") Then Return Asc("Ä")
If ascii=Asc("ö") Then Return Asc("Ö")
If ascii=Asc("ü") Then Return Asc("Ü")
Else
;Buchstaben (->klein)
If ascii>=65 And ascii<=90 Then
Return ascii+32
EndIf
EndIf
Return ascii
EndIf
Next
Return 0
End Function


Das sollte jetzt eigentlich n recht guter GetKey-Ersatz sein.
NumBlock wird davon aber wie beim Original nicht unterstützt. Und im Gegensatz zum Original gibt es keine äh... wie heißen die... internationale Umlaute (?) aus. Also keine Selbstlaute mit "Dacherl" oder "Stricherl". Ebenso wie es kein €-Zeichen und kein µ gibt von meiner Funktion.

Kleiner Wermutstropfen: Diese Funktion ist bei mir geschätzte 350mal langsamer als das Blitz-GetKey!
Aber für 50.000 Aufrufe etwa 7 sek. benötigen - im Debugmode - ist kein Verbrechen... Man ruft diese Funktion doch eh nur einmal pro Hauptschleifendurchlauf auf.

Ich weiß selber noch nicht ob ich nun zufrieden damit bin, aber wir haben in diesem Thread schon jede Menge Inhalt der allen nach Hilfe-suchenden helfen sollte. Was man nun am besten macht, sollte jeder für sich überlegen - und genau das tu ich jetzt.

Danke an alle!
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Der Eisvogel

BeitragMi, Jul 14, 2010 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei der mGUI von East-Power-Soft ist eine geniale GetKey-Funktion dabei. Die beachtet wirklich alles. Feststelltaste, Num-Lock, ...

EDIT: Die hat auch eine automatische Wiederhol-Funktion drin.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group