AGB  ·  Datenschutz  ·  Impressum  







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

Windows Tastatur öffnen

Ein Thema von dtpfl · begonnen am 19. Jan 2018 · letzter Beitrag vom 19. Jan 2018
Antwort Antwort
Benutzerbild von dtpfl
dtpfl

Registriert seit: 19. Jan 2018
Ort: Bayern
20 Beiträge
 
Delphi 12 Athens
 
#1

Windows Tastatur öffnen

  Alt 19. Jan 2018, 10:23
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
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 10:29
Wie startest du sie? CreateProcess? ShellExecute?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von dtpfl
dtpfl

Registriert seit: 19. Jan 2018
Ort: Bayern
20 Beiträge
 
Delphi 12 Athens
 
#3

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 10:37
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}
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 10:41
Welche Windows 10-Version genau? Wenn ich mich richtig erinnere war unter 1607 (oder 1703? ) das leider so dass von einer Win32-Anwendung aus die Bildschirmtastatur einfach nicht aufging...
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 10:43
Probier mal CreateProcess - da hast du normalerweise die bessere Kontrolle. Z. B. könntest du mit TStartupInfo.wShowWindow rumspielen.
Uli Gerhardt
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#6

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 11:21
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.

Geändert von Fukiszo (19. Jan 2018 um 11:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 11:31
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 11:51
Eigentlich sollte doch zumindest für Edit-Felder automatisch die Bildschirmtastatur aufgehen, wenn du in der DPR am Anfang ein Application.UseMetropolisUI aufrufst. Kann das mangels passender Hardware gerade nicht testen.

Edit: Ich sehe gerade, daß das nur für Windows 7 galt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (19. Jan 2018 um 12:06 Uhr)
  Mit Zitat antworten Zitat
Towmuz

Registriert seit: 21. Sep 2016
Ort: Minden
127 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 11:55
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;
Thomas

Geändert von Towmuz (19. Jan 2018 um 12:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dtpfl
dtpfl

Registriert seit: 19. Jan 2018
Ort: Bayern
20 Beiträge
 
Delphi 12 Athens
 
#10

AW: Windows Tastatur öffnen

  Alt 19. Jan 2018, 12:09
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).

Welche Windows 10-Version genau? Wenn ich mich richtig erinnere war unter 1607 (oder 1703? ) das leider so dass von einer Win32-Anwendung aus die Bildschirmtastatur einfach nicht aufging...
Windows 10 Pro 10.0.15063 (Build 15063)

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

Wow danke an alle für die schnellen Antworten!
  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 14:23 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