Autor |
Beitrag |
Dusty
      
Beiträge: 62
Windows XP
Delphi 5 Enterprise
|
Verfasst: Fr 26.09.08 00:26
Ich möchte die CAPS LOCK Taste sytemweit abfangen bzw. dafür sorgen, dass sie ausgeschaltet bleibt. Ich habe jetzt ein Programm, welches diese Taste abfängt. Hier mal ein Code-Schnipsel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| ... RegisterHotKey(Handle, ID_CAPS, 0, VK_CAPITAL) ...
function IsCapsLockOn : boolean; var KeyboardState: TKeyboardState; begin GetKeyboardState(KeyboardState); if KeyboardState[VK_CAPITAL]=1 then result := true else result := false; end;
procedure TForm1.WMHotKey(var Msg : TWMHotKey); begin if (Msg.HotKey = ID_CAPS) then begin if IsCapsLockOn then Label2.Caption := 'Caps Lock OFF - ' + IntToStr(GetTickCount) else Label2.Caption := 'Caps Lock ON - ' + IntToStr(GetTickCount); end; end; |
GetTickCount ist dabei, damit ich sehe, dass das Label verändert wurde.
Bei Setzen eines Haltepunkts wird das Fenster gewechselt und zwischen OFF und ON gewechselt.
Ohne Fensterwechsel bleibt der Status immer gleich!
Ein Problem ist, dass die LED Anzeige und das Verhalten der Tastatur nicht mehr übereinstimmen.
Ein anderes, das bei Fensterwechsel (!) der Status der CAPS LOCK Taste geändert wird.
Also in meinem Programm ist CAPS LOCK aus, aber bei Notepad Aufruf ist CAPS LOCK dann ein.
Bei Rückkehr in mein Programm kann ich dann CAPS Lock nicht mehr ausschalten - ziemlich schlecht!
Hat da jemand ein Idee?
Hinweis: Ich kann nicht ins System eingreifen, da ich keine ADMIN Rechte habe. Sonst wäre es ja einfach
Wichtig ist, dass CAPS LOCK in ANDEREN Programmen verhindert wird!
Versteht mich jemand?
Moderiert von Gausi: Schnipp-Schnapp durch Delphi-Tags ersetzt.Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 26.09.2008 um 10:19
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 28.09.08 11:22
hi,
denkansatz:
Zu Beginn des Programms den CapsLock-Status lesen und in eine boolsche Variable schreiben.
Immer wenn GetAsyncKeyState(VK_CAPITAL)<>0 die Variable umstellen
Wenn du Caps-Lock austellen willst, Timer auf Intervall=50 setzen und im OnTimer Event CapsLock ausstellen. Wie man CapsLock austellt, steht sicherlich irgendwo im Forum.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 28.09.08 15:46
Hast du dir mal GetAsyncKeystate angeguckt? Aber warum systemweit?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 28.09.08 18:02
Luckie hat folgendes geschrieben: | Hast du dir mal GetAsyncKeystate angeguckt? Aber warum systemweit? |
Naja, weil ihn die Feststelltaste wohl auch in anderen Programmen nervt.
E: Oder hab' ich jetzt irgendetwas übersehen? 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: So 28.09.08 18:33
AFAIR konnte man die übrigens auch einfach per Registry deaktivieren.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Dusty 
      
Beiträge: 62
Windows XP
Delphi 5 Enterprise
|
Verfasst: Mo 29.09.08 11:09
Mal von hinten nach vorne ...
@Timosch: Ja, kann man in der Registry deaktivieren, aber nur mit ADMIN Rechten. Siehe Posting: KEINE Admin Rechte vorhanden. Deshalb gehts so leider nicht
Systemweit abschalten - weil die Taste in allen Programmen nervt, insbes. bei dem Programm, was ich hauptsächlich an meinem Arbeitsplatz benutze. Und genau DA will ich die CapsLock Funktion eliminieren.
@Xion: Das mit dem Timer hatte ich mir auch schon überlegt, wäre aber nur eine Notlösung, denn ich will das System nicht mit Abfragen bombardieren, wenn es nicht unbedingt sein muss. (Mein Programm hat schon einen Timer.)
Erstaunlicherweise kann mein Programm den Status der Taste nicht tatsächlich feststellen.
Merkwürdig ist auch, dass ich mit dem Abfangen der CapsLock Taste zwar die Funktion unterbinden kann (es wird weiterhin klein geschrieben), aber die Tastatur LED geht trotzdem an!! Es funktioniert alles - bis zu dem Zeitpunkt wo ein neues Fenster geöffnet wird (z. B. Notepad) - dann schaltet sich Caps Lock ein und ich kann es nicht wieder ausschalten, weil ich ja die Taste abfange. Und das ist wirklich übel
Die Abfrage des Status der Taste ist nicht möglich. Soll ich mal ein ein Beispielprogramm zum testen dranhängen? (D5)
GetAsyncKeystate habe ich mir noch nicht angeguckt. Werde gleich mal googlen ...
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 29.09.08 11:20
Sollte es nicht genügen, einen zweiten Tastendruck zu simulieren, um LED und Capslock wieder auszuschalten 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dusty 
      
Beiträge: 62
Windows XP
Delphi 5 Enterprise
|
Verfasst: Mo 29.09.08 11:50
Optimal wäre es eigentlich, die Caps Lock Taste wie eine normale Umschalt-Taste arbeiten zu lassen. Eigentlich will man ja groß schreiben - aber nur einen Buchstaben. Das wäre wirklich optimal .... Also CAPS LOCK abfangen und dafür ein SHIFT "unterschieben". Ist das möglich? (Systemweit!)
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 29.09.08 11:57
Dusty hat folgendes geschrieben: | Optimal wäre es eigentlich, die Caps Lock Taste wie eine normale Umschalt-Taste arbeiten zu lassen. Eigentlich will man ja groß schreiben - aber nur einen Buchstaben. Das wäre wirklich optimal .... Also CAPS LOCK abfangen und dafür ein SHIFT "unterschieben". Ist das möglich? (Systemweit!) |
für sowas bräuchte man einen keyboardhook nehm ich an.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 29.09.08 12:01
Endlich fällt das Stichwort Hook *g*. Dazu habe ich auch gleich Lesestoff parat.
|
|
Dusty 
      
Beiträge: 62
Windows XP
Delphi 5 Enterprise
|
Verfasst: Mo 29.09.08 15:20
In dem Tutorial steht aber auch gleich, dass man "Kopfstände" machen müsste, um so Dinge wie Strg-Alt-Entf oder Caps-Lock an den Haken zu nehmen. Ins Betriebssystem eingraben will ich mich eigentlich nicht so gerne ... Aufwand und Nutzen stehen das außer Verhältnis. Ich dachte mehr an etwas einfaches. Aber wenn es nicht geht, dann werde ich mich eben weiter über die Taste ärgern müssen 
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 29.09.08 16:28
vielleicht geht es auch anders aber so spontan ist mir nur das stichwort hook eingefallen. Es kann sein das es einen einfacheren weg gibt den im großen und ganzen bin ich eigentlich auch noch programmieranfänger.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|