Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
Delphi XE3 Enterprise
|
AW: Virtuelle Tastatur ohne Focus
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)
|