AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Virtuelle Tastatur ohne Focus

Ein Thema von mcbain · begonnen am 16. Nov 2011 · letzter Beitrag vom 18. Nov 2011
Antwort Antwort
hathor
(Gast)

n/a Beiträge
 
#1

AW: Virtuelle Tastatur ohne Focus

  Alt 16. Nov 2011, 14:05
Ich habe gerade einen Artikel in CODEPROJECT vor mir - Titel:
Original Virtual PiliKeyboard with Prompt Feature. Samsung R-Series laptop keyboard
- da wird einfach nach dem Klicken der Window-Focus (CWinApi.SetForegroundWindow(hWndTarget) geändert:

Code:
// setting active target window
            if (hWndTarget.ToInt32() != 0)
            {
                CWinApi.SetForegroundWindow(hWndTarget);

                // waiting up to the moment when target window will be on top
                System.Threading.Thread.Sleep(20);
            }
  Mit Zitat antworten Zitat
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#2

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 07:37
Wenn ich das bspw. so mache:

Code:
procedure TForm3.FormKeyPress(Sender: TObject; var Key: Char);  //Form3 ist die Form auf dem das Keyboard liegt
begin
   Form2.edit1.SetFocus;
end;
Dann blinkt Form2 und Form3 bloß kurz auf, aber er schreibt nicht in edit1.
Dafür muss es doch eine elegante Lösung geben oder? Das aufblinken ist nämlich auch nicht so schön. Es funktioniert ja auch, wenn es in einer eigenen Anwendung aufgerufen wird...

Hat noch jemand einen Tip evtl.?

Geändert von mcbain (17. Nov 2011 um 07:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 08:10
Ich habe gerade keinen Zugriff auf meine Sourcen, als QuickHack könnte ich mir folgendes vorstellen.
Annahme das Fenster mit der virtuellen Tastatur bildet die Tasten über ein/mehrer Images oder Speedbutton o.ä. ab.
Delphi-Quellcode:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
   With Form2 do
    begin
      width := 300;
      height := 200;
      Left := TWincontrol(Sender).Left + TWincontrol(Sender).Width;
      Top := TWincontrol(Sender).Top;
      Parent := Self;
      Show;
    end;
end;
der Tastaturcode nur testweise
Delphi-Quellcode:
procedure SendKeys(sText: String);

var
 i : Integer;
 shift : Boolean;
 vk, scancode : Word;
 ch : Char;
 c, s : Byte;
const
 vk_keys : Array[0..9] of Byte=(VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
 vk_shft : Array[0..2] of Byte=(VK_SHIFT, VK_CONTROL, VK_MENU);
 flags : Array[FALSE..TRUE] of Integer = (KEYEVENTF_KEYUP, 0);
 C_ALTGRS = ['\','@','~','²','³','','{','}','[',']'];

begin
 shift:=FALSE;
 for i:=1 to Length(sText) do begin
   ch:=sText[i];
     if (ch>=#250) then begin
     s:=Ord(ch)-250;
     shift:=NOT Odd(s);
     c:=vk_shft[s shr 1];
     scancode:=MapVirtualKey(c, 0);
     Keybd_Event(c, scancode, flags[shift], 0);
   end else begin
     vk:=0;
     if (ch>=#240) then
       c:=vk_keys[Ord(ch)-240]
     else if (ch>=#228) then
       c:=Ord(ch)-116
     else if (ch<#32) then
       c:=Ord(ch)
     else begin
       vk:=VkKeyScan(ch);
       c:=LoByte(vk);
     end;

     scancode:=MapVirtualKey(c, 0);

     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU, MapVirtualKey(VK_RMENU,0), 0, 0)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A, 0, 0 );
     Keybd_Event( c, scancode, 0, 0 );
     Keybd_Event( c, scancode, KEYEVENTF_KEYUP, 0 );
     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU,MapVirtualKey(VK_RMENU,0), KEYEVENTF_KEYUP, 0)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);

   end;
   Application.ProcessMessages;
 end;
end;


procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   SendKeys('Test');
end;
Oder alternativ eine Prozedur in die virtuelle Tastatur einbauen, der das Wincontrol übergeben wird.
Dort alles Merken (Parent/Fontsize/Left/Top/aling/Ancors etc...)
Dann dem Control ein Panel auf der Tastatur als Parent zuweisen, ausrichten etc. und anzeigen , im Close alles wieder herstellen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (17. Nov 2011 um 08:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 09:02
Probiers mal so:

Delphi-Quellcode:
SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
  SetWindowPos(self.Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#5

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 10:38
@Bummi
Das ist sehr ausführlich, vielen Dank. Aber ich denke das ganze muss wesentlich einfacher zu realisieren sein, da es ja in einer externen Anwendung genau so funktioniert wie ich möchte. Ich will halt nur nicht immer ne externe Anwendung aufrufen müssen.

@divBy0
Ich hab es so eingebaut:

Code:
procedure TForm2.btn1Click(Sender: TObject);
begin
  form3 := TForm3.Create(Application);
  SetWindowLong(form3.handle, GWL_EXSTYLE,GetWindowLong(form3.handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
  SetWindowPos(form3.Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
  form3.Visible := true;

end;
Aber am Verhalten hat sich nix geändert...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#6

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 11:11
Aber ich denke das ganze muss wesentlich einfacher zu realisieren sein, da es ja in einer externen Anwendung genau so funktioniert wie ich möchte. Ich will halt nur nicht immer ne externe Anwendung aufrufen müssen.
Es ist aber halt doch ein Unterschied, ob eine externe Anwendung aktiviert wird (oder eben auch nicht), oder ob ein anderes Form der aktiven Anwendung den Fokus erhält. Manchmal ist das, was einfach erscheint, doch eben nicht so einfach zu realisieren - wenn es denn überhaupt geht. Es ist sehr wohl möglich, daß die mitgelieferte Bildschirmtastatur in diesem Fall für deine Zwecke nicht geeignet ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Virtuelle Tastatur ohne Focus

  Alt 17. Nov 2011, 11:30
Immer, wenn eine Eingabemaske den Fokus bekommt, kann man sich im VirtuellenKeyboard in einem Property merken, welche es ist.
Immer, wenn ein Eingabefeld den Fokus bekommt, kann man sich im VirtuellenKeyboard einem Property merken, welches es ist.
Beim Klick eines Buttons im VK kann man nun dem richtigen Edit eine Message senden, welche Taste gedrückt wurde, und danach die richtige Maske retour-aktivieren.
...oder?
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz