Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTouchKeyboard im Kampf mit echten Tastaturen (https://www.delphipraxis.net/193197-ttouchkeyboard-im-kampf-mit-echten-tastaturen.html)

Der schöne Günther 4. Jul 2017 18:27

TTouchKeyboard im Kampf mit echten Tastaturen
 
Die Windows-Bildschirmtastatur bekommt es mit wenn man auf einer echten Hardware-Tastatur Shift oder Capslock drückt. Das TTouchKeyboard in der VCL leider nicht. So kann es passieren dass man auf einer echten (oder virtuellen) Tastatur Capslock aktiviert und sich fortan wundert warum man in einer VCL-Anwendung auf dem TTouchkeyboard die Taste "4" drückt und ein "$" rauskommt.

Gibt es eine einfache Lösung hierfür? Das
Delphi-Quellcode:
TTouchKeyboard
bekommt z.B. den Wechsel des Tastaturlayouts (andere Sprache) völlig souverän mit und ändert sich, richtig cool. Ich kann diesen Neuaufbau forcieren indem ich der Tastatur eine CM_INPUTLANGCHANGE-Nachricht sende:
Delphi-Quellcode:
TouchKeyboard1.Perform(CM_INPUTLANGCHANGE, WPARAM(0), LPARAM(0));
Meine Frage wäre: Wann?
  1. Mich mittels globalem Keyboard-Hook einklemmen und das jedes mal tun wenn jemand Shift oder Capslock drückt
  2. In irgendeinem KeyDown-Event auf jedem Formular/Frame das ein TTouchKeyboard hat
  3. Eine andere, elegante Möglichkeit

Uwe Raabe 4. Jul 2017 19:28

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Du könntest auch eine Ableitung (Interposer-Class) von TTouchKeyboard verwenden, das z.B. einen Message-Handler für WM_KEYDOWN, WM_KEYUP implementiert und auf VK_CAPITAL reagiert.

(nicht ausprobiert!)

Delphi-Quellcode:
type
  TTouchKeyboard = class(Vcl.Touch.Keyboard.TTouchKeyboard)
  protected
    procedure WMKeyUp(var Message: TWMKeyUp); message WM_KEYUP;
  end;

procedure TTouchKeyboard.WMKeyUp(var Message: TWMKeyUp);
begin
  inherited;
  if Message.CharCode = VK_CAPITAL then begin
    SendMessage(Handle, WM_INPUTLANGCHANGE, 0, 0);
  end;
end;

himitsu 4. Jul 2017 20:16

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Kann es sein, dass das TouchKeyboard Probleme hat, wenn die Anwendung nicht den Fokus hat und man da den Status ändert?
Das selbe Problem sollte dann aber auch auftauchen, wenn man eine andere virtuelle Tastatur zwischendrin nutzt oder z.B. RDP/TeamViewer/...

TTouchKeyboard.WMKeyUp ?
Die virtuelle Tastatur sollte aber niemals den Eingabefokus bekommen und somit doch eigentlich auch keine WM_KEY bekommen. :gruebel:
Der Fokus bleibt eigentlich in dem Edit, wo man was rein schreibt.

Wenn was übersehen wurde, dann könnte man vielleicht allgemein bei KeyUp KeyDown auf alle Tasten reagieren.
Die Locked-Keys reagieren auf das Niederdrücken, mit der Statusänderung, und auch bei den anderen Tasten ist bereits der Status während des Niederdrückens wichtig.
Dort vor der Tastenbehandlung (inherited) den aktuellen Status des Tastaturpuffers mit dem des TTouchKeyboard vergleichen und bei Differenzen das WM_INPUTLANGCHANGE losschicken.
Alternativ auch beim Activate der Application den aktuellen Status neu laden.

Uwe Raabe 4. Jul 2017 20:51

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Zitat:

Zitat von himitsu (Beitrag 1375988)
Die virtuelle Tastatur sollte aber niemals den Eingabefokus bekommen und somit doch eigentlich auch keine WM_KEY bekommen.

Stimmt auch wieder.

Der schöne Günther 2. Nov 2017 19:36

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Ideen werden weiterhin dankend entgegengenommen :love:

TiGü 3. Nov 2017 12:33

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Die OSK selber in der eigene Anwendung verwenden? Wäre das eine Option?
https://stackoverflow.com/questions/...ard-in-wpf-app

Der schöne Günther 3. Nov 2017 12:38

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Das Windows-OSK starten und mit SetParent in die eigene Oberfläche einbetten? Da fürchte ich mich ehrlich gesagt vor.
  • Irgendein Windows-Update verändert vielleicht das OSK und das fliegt der Software dann um die Ohren
  • Bestimmt Probleme zwischen Admin-Prozess/Nicht-Admin-Prozess
  • Bestimmt Merkwürdigkeiten wenn der Nutzer weiterhin das "normale" Windows-OSK öffnen will.

TiGü 3. Nov 2017 13:05

AW: TTouchKeyboard im Kampf mit echten Tastaturen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1384949)
Das Windows-OSK starten und mit SetParent in die eigene Oberfläche einbetten? Da fürchte ich mich ehrlich gesagt vor.
  • Irgendein Windows-Update verändert vielleicht das OSK und das fliegt der Software dann um die Ohren
  • Bestimmt Probleme zwischen Admin-Prozess/Nicht-Admin-Prozess
  • Bestimmt Merkwürdigkeiten wenn der Nutzer weiterhin das "normale" Windows-OSK öffnen will.

Wer nicht wagt, der nicht gewinnt! :wink: :spin2:

Also das OSK scheint richtig tief im System drin zu stecken.
Wenn ich da die Feststelltaste drücke, dann leuchtet die LED dazu auf meiner Hardwaretastatur auf! :shock:
Vielleicht gelingt es dir per API-Monitor (http://www.rohitab.com/apimonitor) rauszuknobeln, welche Funktionen dafür aufgerufen werden und das in einer eigenen Ableitung von TTouchScreenKeyboard zu integrieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz