Caps Lock - Zustand

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Caps Lock - Zustand

Beitrag von andreas »

Hallo Leute,

weisst jemand, wie ich den Zustand von Caps Lock abfragen kann?
Irgendwie finde ich garnichts. Ich habe schon mit AppKeyState versucht. Das bringt aber nichts, da es nur den Zusand der Taste (gedrückt oder nicht) abfragt.
Zuletzt geändert von andreas am Di, 18. Apr 2006 11:29, insgesamt 1-mal geändert.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
das ist schon die richtige Funktion - nur wahrscheinlich die falsche Version :wink:
In der Hilfe der aktuellen 1.9 RC2_refresh (1.9.328) ist zu dieser Funktion nämlich noch einiges hinzugekommen:
Es gibt jetzt einen weiteren Parameter, mit dem definiert werden kann, ob nur (wie bisher) der Status abgefragt werden soll (Taste ist gedrückt/nicht gedrückt), oder ob der sogenannte "Toggle-Status" abgefragt werden soll (Taste ist dauerhaft gedrückt - wie bei Caps-Lock).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Caps Lock - Zustand

Beitrag von AUGE_OHR »

andreas hat geschrieben:Hallo Leute,
weisst jemand, wie ich den Zustand von Caps Lock abfragen kann?
Irgendwie finde ich garnichts. Ich habe schon mit AppKeyState versucht. Das bringt aber nichts, da es nur den Zusand der Taste (gedrückt oder nicht) abfragt.
#define APPKEY_TOGGLED 2 // Missing from AppEvent.ch
#define VK_CAPITAL 0x14 // Caps Lock
#define VK_NUMLOCK 0x90 // Num Lock key
#define VK_SCROLL 0x91 // Scroll Lock

STATIC lCAPS := .F.

IF AppKeyState(VK_CAPITAL , .t.) == APPKEY_TOGGLED
IF lCAPS
ELSE
lCAPS := .T.
ENDIF
ELSE
IF lCAPS
lCAPS := .F.
ENDIF
ENDIF

FUNCTION IS_CAPS_ON()
RETURN lCAPS

gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,

ist das vielleicht für XBase++ 1.9, so wie es Martin schon gesagt hat?
Unter 1.82 hat der Befehl AppKeyState(VK_CAPITAL , .t.) keinen 2. Parameter.
Wenn das so ist, kann ich es erst mit der neuen Version testen, was ich auch machen werde. Jetzt möchte ich es noch nicht tun, da das Programm ständig benutzt wird.

Sonst möchte ich mich für die Hilfe bedanken. Über den 2. Parameter in der neuen Version habe ich nocht nicht gewusst.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
ja - der zweite Parameter ist neu unter der 1.9.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben: ja - der zweite Parameter ist neu unter der 1.9.
nö, das gibt es schon seit der Xbase++ v1.5x.

*** snip ***

According to Volker Spahn from Alaska, this is an undocumented
parameter of AppKeyState().

Message "KbdStat() reports KST_NUMLOCK instead of KST_NUM"
from September / 26 / 2001 in alaska-software.news.bugreport

*** eof ***

in der v1.9x ist es endlich "documentiert" worden, (weil ich gemeckert
habe ? ), aber leider ist das "Demo" immer noch "nichtssagend"

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

aber leider ist das "Demo" immer noch "nichtssagend"
Leider ist das bei Demos - nicht nur bei Alaska - häufig der Fall.
Das offensichtliche wird gezeigt, das worauf es ankommt nicht. :?
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,

du hast recht. Als ich mein Programm mit deinem Code erweitert habe, hat es unter XBase++ 1.82 ohne Fehlermeldungen funktioniert.

Wieviele undokumentierte Funktionen es wohl noch gibt? Vielleicht sollte der jenige, der die kennt, einmal hier veröffentlichen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

ich habe jetzt ein weiteres Problem dabei.
Da das Drucken der Caps-Lock-Taste kein Ereignis (bzw. nur beim Ausschalten) auslösst, wird meine Ansicht nicht oder nur beim Drucken einer anderen Taste aktualisiert.
Gibt es eine andere Möglichkeit ausser :keyboard, auf das Drucken der Caps-Lock-Taste zu reagieren?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

andreas hat geschrieben:ich habe jetzt ein weiteres Problem dabei.
Da das Drucken der Caps-Lock-Taste kein Ereignis (bzw. nur beim Ausschalten) auslösst, wird meine Ansicht nicht oder nur beim Drucken einer anderen Taste aktualisiert.
Gibt es eine andere Möglichkeit ausser :keyboard, auf das Drucken der Caps-Lock-Taste zu reagieren?
die Frage ist wie du es einsetzten möchtest. Bei mit hab ich den v1.9x
XbpStatusbar() ersetzten müssen weil MSCOMCTL.OCX nicht unter XP64
läuft. Der KB_Status() läuft nun in einem Thread und fragt per Function
den Status der STATIC lCaps etc. ab und verwenden den zur Anzeige
in dem Statusbar.

willst du ohne eine STATIC arbeiten geht das wohl so :

Code: Alles auswählen


***********************************************************************
* FUNCTION Capslock( [lLock] ) -> lOldLocked
***********************************************************************
#define KEYEVENTF_EXTENDEDKEY        0x01
#define KEYEVENTF_KEYUP              0x02

#define APPKEY_TOGGLED     2                    // Missing from AppEvent.ch
#define VK_CAPITAL      0x14                    // Caps Lock
#define VK_NUMLOCK    0x90                    // Num Lock key
#define VK_SCROLL       0x91                    // Scroll Lock
#Define VK_INSERT       0x2D                    // ???

DLLFUNCTION GetKeyState( nVirtKey )  USING STDCALL FROM USER32.DLL
DLLFUNCTION keybd_event( nVirtKey, nScanCode, nFlags, nExtra )  USING STDCALL FROM USER32.DLL

FUNCTION Capslock( lLock )
   LOCAL nByte

   nByte  := GetKeyState(VK_CAPITAL)

   // if nByte[1] then CapsLock is ON
   IF lLock == NIL
      RETURN nByte[1]
   ELSEIF lLock .AND. !nByte[1]  // Turn CapsLock ON
      IF !GetKeyState(VK_CAPITAL)[1]
         keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY, 0 )
         keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 )
      ENDIF
   ELSEIF !lLock .AND. nByte[1]  // Turn CapsLock OFF
      keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY, 0 )
      keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 )
   ENDIF

RETURN nByte[1]

gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,

danke für deine Antwort.
Mit den Threads hätte ich selbst drauf kommen sollen, da ich die ständig benutzt. Blöd. :(
Gruß,

Andreas
VIP der XUG Osnabrück
Antworten