Afficher et cacher le clavier Windows 8 à l'écran de WPF

j'écris une application WPF pour une tablette Windows 8. C'est Full windows 8 et pas ARM/RT.

lorsque l'utilisateur entre dans une zone de texte, j'affiche le clavier à l'écran en utilisant le code suivant:

System.Diagnostics.Process.Start(@"C:Program FilesCommon FilesMicrosoft SharedinkTabTip.exe");

cela fonctionne bien mais je ne sais pas comment cacher le clavier à nouveau?

Quelqu'un sait faire ça?

aussi, y a-t-il un moyen de redimensionner mon application pour que le contrôle focalisé soit déplacé lorsque le clavier apparaît? Un peu comme pour une application Windows RT.

Merci Beaucoup

13
demandé sur Sun 2013-06-13 18:56:51

8 réponses

je pouvais fermer le clavier à l'écran avec le code C suivant.

[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName,string lpWindowName);

[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;

private void closeOnscreenKeyboard()
{
    // retrieve the handler of the window  
    int iHandle = FindWindow("IPTIP_Main_Window", "");
    if (iHandle > 0)
    {
        // close the window using API        
        SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
    }  
}

private void Some_Event_Happened(object sender, EventArgs e)
{
    // It's time to close the onscreen keyboard.
    closeOnscreenKeyboard();
}

j'espère que cela vous aidera.

15
répondu tasasaki 2014-04-02 00:39:49

un peu en retard, je vais juste améliorer l'exemple de tasaki pour un complet de ce que j'ai fait pour activer Afficher/Cacher sur l'événement gotFocus/LostFocus lorsque l'utilisateur clique sur une boîte de texte dans mon application WPF pour Windows 8 tablette.J'espère que cela aidera les gens avec des maux de tête similaires, parce que désactiver InkHelper, ne fonctionne pas vraiment bien si vous voulez faire défiler avec l'événement touch...

tout d'abord, vous devez ajouter ces références à votre application.XAML.cs Fichier.

using System.Management;
using System.Runtime.InteropServices;

le code:

    protected override void OnStartup(StartupEventArgs eventArgs)
    {
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.GotFocusEvent,
                                new RoutedEventHandler(GotFocus_Event), true);
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.LostFocusEvent,
                                new RoutedEventHandler(LostFocus_Event), true);

       MainApplication.Show();
    }

    private static void GotFocus_Event(object sender, RoutedEventArgs e)
    {
       // TestKeyboard();
        OpenWindows8TouchKeyboard(sender, e);
    }
    //http://www.c-sharpcorner.com/UploadFile/29d7e0/get-the-key-board-details-of-your-system-in-windows-form/
    private static bool IsSurfaceKeyboardAttached()
    {
        SelectQuery Sq = new SelectQuery("Win32_Keyboard");
        ManagementObjectSearcher objOSDetails = new ManagementObjectSearcher(Sq);
        ManagementObjectCollection osDetailsCollection = objOSDetails.Get();
        //Windows 8 tablet are returnign 2 device when keyboard is connecto
        //My application won't be used for Desktop so this condition is fine
        //But u might want to see if keyboard is usb and == 1 so you are 
        //returning true or not on tablet.  
        return osDetailsCollection.Count <= 1 ? true : false;
    }

    private static void OpenWindows8TouchKeyboard(object sender, RoutedEventArgs e)
    {
        var textBox = e.OriginalSource as TextBox;        
        if (textBox != null && IsSurfaceKeyboardAttached())
        {
            var path = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
            if (!File.Exists(path))
            {
                // older windows versions
                path = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\osk.exe";
            }
            Process.Start(path);
            textBox.BringIntoView();//SetFocus so u dont lose focused area
        }
    }
    [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    public const int WM_SYSCOMMAND = 0x0112;
    public const int SC_CLOSE = 0xF060;
    public const int SC_MINIMIZE = 0xF020;

    private void CloseOnscreenKeyboard()
    {
        // retrieve the handler of the window  
        int iHandle = FindWindow("IPTIP_Main_Window", "");
        if (iHandle > 0)
        {
            // close the window using API        
            SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
        }
    }

    private void LostFocus_Event(object sender, EventArgs e)
    {
        // It's time to close the onscreen keyboard.
        CloseOnscreenKeyboard();
    }
5
répondu Guillaume 2015-09-09 00:24:42

je open-source de mon projet est d'automatiser tout ce qui concerne TabTip de l'intégration en application WPF.

vous pouvez l'obtenir sur nuget , et après cela tout ce dont vous avez besoin est une simple configuration dans votre logique de démarrage d'applications:

TabTipAutomation.BindTo<TextBox>();

vous pouvez lier la logique D'automatisation de TabTip à n'importe quel élément. Le clavier virtuel s'ouvrira quand un tel élément aura la mise au point, et il se fermera quand l'élément perdra la mise au point. Non seulement cela, mais TabTipAutomation déplacera UIElement (ou Window) dans la vue, de sorte que TabTip ne bloquera pas l'élément focalisé.

pour plus d'informations, veuillez vous référer au site du projet .

1
répondu Макс Федотов 2016-08-24 07:36:04

Eh bien, je voudrais essayer quelque chose comme ça

Process myProcess = Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
myProcess.CloseMainWindow();
myProcess.Close();
0
répondu Kapitán Mlíko 2013-06-13 15:13:00

Je ne suis pas sûr de savoir comment Cacher le clavier programmatique, mais comme vous le savez, je viens de publier un échantillon sur la façon de déclencher (as-in, montrer) le clavier tactile dans les applications WPF quand un utilisateur clique dans une boîte de texte, son ici:

http://code.msdn.microsoft.com/Enabling-Windows-8-Touch-7fb4e6de

la chose cool au sujet de cet échantillon, car il ne nécessite pas l'utilisation de processus et utilise plutôt L'API Windows 8 supportée pour déclencher le clavier tactile pour les commandes TextBox en utilisant l'automatisation.

c'est quelque chose sur lequel je travaille depuis de nombreux mois, je suis heureux de pouvoir enfin donner cet exemple à notre communauté. S'il vous plaît laissez-moi savoir si vous avez des questions, suggestions, problèmes, etc dans l'échantillon Q&Un volet

0
répondu Dmitry Lyalin 2013-12-13 19:34:54

peut-être que vous pouvez essayer la solution publiée sur ce blog: http://mheironimus.blogspot.nl/2015/05/adding-touch-keyboard-support-to-wpf.html

Il contient certaines des choses que vous avez demandé (et plus):

  • d'Afficher et de masquer le clavier
  • Déplacer le focus à l'aide de FrameworkElement.BringIntoView ()
  • FrameworkElement.InputScope propriété de choisir la disposition du clavier à afficher (numérique, email, url, etc))
0
répondu pogosama 2015-06-30 06:06:53

essayer celui-ci

System.Diagnostics.Process.Start("TabTip.exe");

j'espère que cela vous aidera.

0
répondu Amirhossein Yari 2017-12-12 21:17:11

cela devrait fonctionner pour ouvrir, puis tuer le processus.

Process proc = Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
proc.Kill();

tuer le processus va le fermer.

si vous déboguez et passez à travers ces deux lignes, cependant, la même erreur que vous avez mentionnée ci - dessus se produit -" Processus a quitté, de sorte que l'information de demande n'est pas disponible."

si vous n'êtes pas en franchissant ces deux lignes pendant le débogage, aucune exception n'est lancée et l'écran clavier sera tué.

si vous utilisez CloseMainWindow() le clavier ne se ferme pas. CloseMainWindow() est pour les processus avec un UI , donc vous penseriez qu'il serait efficace sur ce, mais peut-être parce que le clavier fait partie de L'OS il ne compte pas.

confirmez que cela fonctionne, puis jetez le proc.Kill() dans un try-catch avec la journalisation d'erreur pour la tranquillité d'esprit.

-1
répondu jporcenaluk 2017-05-23 10:33:50