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/)
-   -   Windows Tastatur öffnen (https://www.delphipraxis.net/194920-windows-tastatur-oeffnen.html)

dtpfl 19. Jan 2018 09:23

Windows Tastatur öffnen
 
Hallo!
Ich möchte via Button klick die Windows Tastatur öffnen. Es sollte auf einem normalen Desktop(Win 10) & einem Tablet(Win 10) funktionieren.

Habe es mit der TabTip.exe(C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe) versucht
http://www.delphipraxis.net/186239-w...-aufrufen.html

Bei dem Desktop Rechner funktioniert es einwandfrei. Ich kontrolliere ob die TabTip.exe offen ist, wenn ja beende ich sie & starte sie = Tastatur wird angezeigt. Nicht der effizienteste weg, würde aber für meinen fall ausreichen.

Bei dem Tablet wird die TabTip.exe beendet falls offen & gestartet. Jedoch nicht angezeigt. Der prozess läuft im hintergrund & ist aktiv.

Gibt es einen weg die Windows Tastatur aufzurufen bzw. zu öffnen? Am besten ohne "zerstören" vom Task.

Vielen Dank im Voraus!
Daniel

uligerhardt 19. Jan 2018 09:29

AW: Windows Tastatur öffnen
 
Wie startest du sie? CreateProcess? ShellExecute?

dtpfl 19. Jan 2018 09:37

AW: Windows Tastatur öffnen
 
Delphi-Quellcode:
{$IFDEF MSWINDOWS}
procedure openKeyboard();
var
  FPath : String;
  IPTip_Main_Window: HWND;
begin
    FPath := 'C:\Program Files\Common Files\microsoft shared\ink\tabtip.exe';

    IPTip_Main_Window := FindWindow('IPTip_Main_Window', nil);

    if IPTip_Main_Window > 0 then
      PostMessage(IPTip_Main_Window, WM_SYSCOMMAND, SC_CLOSE, 0);


    if FileExists(FPath) then
      ShellExecute(0, 'OPEN', PChar(FPath), '', '', 1);

end;
{$endif}

Der schöne Günther 19. Jan 2018 09:41

AW: Windows Tastatur öffnen
 
Welche Windows 10-Version genau? Wenn ich mich richtig erinnere war unter 1607 (oder 1703? :gruebel:) das leider so dass von einer Win32-Anwendung aus die Bildschirmtastatur einfach nicht aufging...

uligerhardt 19. Jan 2018 09:43

AW: Windows Tastatur öffnen
 
Probier mal CreateProcess - da hast du normalerweise die bessere Kontrolle. Z. B. könntest du mit TStartupInfo.wShowWindow rumspielen.

Fukiszo 19. Jan 2018 10:21

AW: Windows Tastatur öffnen
 
Gehört da nicht noch ein bisschen wartezeit rein?
Ein Handle ein Close command zu schicken, das es erstmal verarbeiten muss, wird aber sofort neu gestartet, ich vermute das geht deinem rechner zu schnell.
Evtl. mal mit ProcessExplorer (SysInternals) gucken wie oft dein tabtip.exe offen ist wenn du diese funktion aufrufts.

Code:
procedure openKeyboard();
var
  FPath : String;
  IPTip_Main_Window: HWND;
begin
    FPath := 'C:\Program Files\Common Files\microsoft shared\ink\tabtip.exe';

{
    IPTip_Main_Window := FindWindow('IPTip_Main_Window', nil);

    if IPTip_Main_Window > 0 then
      PostMessage(IPTip_Main_Window, WM_SYSCOMMAND, SC_CLOSE, 0);
}

   while FindWindow('IPTip_Main_Window', nil) > 0 do PostMessage(IPTip_Main_Window, WM_SYSCOMMAND, SC_CLOSE, 0);

    if FileExists(FPath) then
      ShellExecute(0, 'OPEN', PChar(FPath), '', '', 1);

end;
das wäre eine radikale lösung.

himitsu 19. Jan 2018 10:31

AW: Windows Tastatur öffnen
 
Und vor dem Sleep noch ein SendMessage statt dem PostMessage, dann muß das Sleep nur auf's Beendetwerden warten und nicht auf den Start davon, bis das Programm endlich mal auf diese Message reagiert.
Natürlich kann man auch schauen ob die Anwengung noch läuft und erst weiter machen, wenn sie weg ist, anstatt nur blind zu schlafen.

Uwe Raabe 19. Jan 2018 10:51

AW: Windows Tastatur öffnen
 
Eigentlich sollte doch zumindest für Edit-Felder automatisch die Bildschirmtastatur aufgehen, wenn du in der DPR am Anfang ein
Delphi-Quellcode:
Application.UseMetropolisUI
aufrufst. Kann das mangels passender Hardware gerade nicht testen.

Edit: Ich sehe gerade, daß das nur für Windows 7 galt.

Towmuz 19. Jan 2018 10:55

AW: Windows Tastatur öffnen
 
Moin,

du kannst es bei Tablets auch wie folgt ansprechen um die standard Mobiletastatur aufzurufen. Funktioniert wunderbar.
Liegt wohl an der geänderten Handhabe bei Win10 für den mobilen Bereich.
(Quelle Stackoverflow)

Delphi-Quellcode:
function TTabletHeadlinePanel.FindTrayButtonWindow: THandle;
var
  ShellTrayWnd: THandle;
  TrayNotifyWnd: THandle;
begin
  Result := 0;
  ShellTrayWnd := FindWindow('Shell_TrayWnd', nil);
  if ShellTrayWnd > 0 then
  begin
    TrayNotifyWnd := FindWindowEx(ShellTrayWnd, 0, 'TrayNotifyWnd', nil);
    if TrayNotifyWnd > 0 then
    begin
      Result := FindWindowEx(TrayNotifyWnd, 0, 'TIPBand', nil);
    end;
  end;
end;

procedure TTabletHeadlinePanel.LogoClick(Sender: Tobject);
var
  TrayButtonWindow: THandle;
begin
  TrayButtonWindow := FindTrayButtonWindow;
  if TrayButtonWindow > 0 then
  begin
    ShowMessage('Tray');
    PostMessage(TrayButtonWindow, WM_LBUTTONDOWN, MK_LBUTTON, $00010001);
    PostMessage(TrayButtonWindow, WM_LBUTTONUP, 0, $00010001);
  end else begin // Edit: ab hier für den Desktop, aber das erklärt sich wohl auch von selbst :)
    ShowMessage('Tabtip');
    ShellExecute(0, 'open', 'c:\Program Files\Common Files\microsoft shared\ink\TabTip.exe', nil, nil, SW_SHOWNA);
  end;
end;

dtpfl 19. Jan 2018 11:09

AW: Windows Tastatur öffnen
 
Habe gerade endtdeckt, das es im Windows 10 Tablet Modus funktioniert, jedoch mit langer verzögerung. Wenn der Tablet Modus deaktiviert ist funktioniert es nicht(wie oben beschrieben).

Zitat:

Zitat von Der schöne Günther (Beitrag 1391364)
Welche Windows 10-Version genau? Wenn ich mich richtig erinnere war unter 1607 (oder 1703? :gruebel:) das leider so dass von einer Win32-Anwendung aus die Bildschirmtastatur einfach nicht aufging...

Windows 10 Pro 10.0.15063 (Build 15063)

Zitat:

Zitat von Towmuz (Beitrag 1391379)
Moin,

du kannst es bei Tablets auch wie folgt ansprechen um die standard Mobiletastatur aufzurufen. Funktioniert wunderbar.
Liegt wohl an der geänderten Handhabe bei Win10 für den mobilen Bereich.
(Quelle Stackoverflow)

Delphi-Quellcode:
function TTabletHeadlinePanel.FindTrayButtonWindow: THandle;
var
  ShellTrayWnd: THandle;
  TrayNotifyWnd: THandle;
begin
  Result := 0;
  ShellTrayWnd := FindWindow('Shell_TrayWnd', nil);
  if ShellTrayWnd > 0 then
  begin
    TrayNotifyWnd := FindWindowEx(ShellTrayWnd, 0, 'TrayNotifyWnd', nil);
    if TrayNotifyWnd > 0 then
    begin
      Result := FindWindowEx(TrayNotifyWnd, 0, 'TIPBand', nil);
    end;
  end;
end;

procedure TTabletHeadlinePanel.LogoClick(Sender: Tobject);
var
  TrayButtonWindow: THandle;
begin
  TrayButtonWindow := FindTrayButtonWindow;
  if TrayButtonWindow > 0 then
  begin
    ShowMessage('Tray');
    PostMessage(TrayButtonWindow, WM_LBUTTONDOWN, MK_LBUTTON, $00010001);
    PostMessage(TrayButtonWindow, WM_LBUTTONUP, 0, $00010001);
  end else begin // Edit: ab hier für den Desktop, aber das erklärt sich wohl auch von selbst :)
    ShowMessage('Tabtip');
    ShellExecute(0, 'open', 'c:\Program Files\Common Files\microsoft shared\ink\TabTip.exe', nil, nil, SW_SHOWNA);
  end;
end;

Super! Hat einwandfrei funktioniert :-D

Wow danke an alle für die schnellen Antworten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 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