Показать и скрыть экранную клавиатуру Windows 8 из WPF

Пишу приложение WPF для планшета Windows 8. Это полная windows 8, а не ARM / RT.

Когда пользователь вводит текстовое поле, я показываю экранную клавиатуру, используя следующий код:

System.Diagnostics.Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");

Это нормально работает, но я не знаю, как снова скрыть клавиатуру?

Кто-нибудь знает, как это сделать?

Кроме того, есть ли способ изменить размер своего приложения, чтобы сфокусированный элемент управления перемещался вверх при появлении клавиатуры? Немного похоже на приложение для Windows RT.

Огромное спасибо


person Sun    schedule 13.06.2013    source источник


Ответы (8)


Я мог успешно закрыть экранную клавиатуру с помощью следующего кода C #.

[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();
}

Я надеюсь, что это поможет вам.

person tasasaki    schedule 14.03.2014

Немного поздно, я просто улучшу пример тасаки для полного из того, что я сделал, чтобы включить отображение / скрытие в событии gotFocus / LostFocus, когда пользователь щелкает текстовое поле в моем приложении WPF для планшета с Windows 8. Надеюсь, это поможет людям с аналогичной головной болью, потому что отключение InkHelper на самом деле не работает, если вы хотите прокручивать с помощью события касания ...

Прежде всего, вы должны добавить эту ссылку в свой файл App.Xaml.cs.

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

Код:

    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();
    }
person Guillaume    schedule 07.08.2015

Я открыл свой проект, чтобы автоматизировать все, что касается интеграции TabTip в приложение WPF.

Вы можете получить его на nuget, и после этого все, что вам нужно, это простая конфигурация в ваших приложениях. логика запуска:

TabTipAutomation.BindTo<TextBox>();

Вы можете привязать логику автоматизации TabTip к любому UIElement. Виртуальная клавиатура откроется, когда любой такой элемент получит фокус, и закроется, когда элемент потеряет фокус. Более того, TabTipAutomation переместит UIElement (или Window) в представление, так что TabTip не будет блокировать элемент с фокусом.

Для получения дополнительной информации посетите сайт проекта.

person Max    schedule 24.08.2016
comment
Могу я попросить вас просмотреть Как предлагать личные библиотеки с открытым исходным кодом?, пожалуйста? - person Martijn Pieters; 24.08.2016

Я бы попробовал что-то вроде этого

Process myProcess = Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
myProcess.CloseMainWindow();
myProcess.Close();
person Kapitán Mlíko    schedule 13.06.2013
comment
Спасибо за ответ, любые идеи о перемещении экрана вверх при появлении клавиатуры. - person Sun; 14.06.2013
comment
@ user1131657 ну это сурово ... разве ты не хочешь сделать так проще? Должны быть некоторые ... Например, взгляните на WPF Touch Screen Keyboard ... там будет подробнее ... и это похоже на лучшее решение, чем то, что пытаются сделать йопу. - person Kapitán Mlíko; 14.06.2013
comment
Виктор, я еще немного поигрался с этим и предпочел бы использовать встроенную клавиатуру сенсорного экрана. Зачем заново изобретать колесо правильно! Я пробовал ваш код, но он не работает. При запуске строки CloseMainWindow я получаю следующую ошибку: Процесс завершен, поэтому запрошенная информация недоступна. - person Sun; 14.06.2013
comment
Ну ... Тогда я тебе ничем не помогу. Прости. Последнее, что я нашел, - это вопрос, помеченный как win7, но он может вам помочь. GL;) - person Kapitán Mlíko; 14.06.2013
comment
Это не работает. Tabtip имеет особое поведение, при котором Windows повторно передает главный экземпляр TabTip, который он запускает сам. Таким образом, запускаемый вами экземпляр является временным и немедленно исчезает. Вместо этого Windows покажет любой существующий экземпляр или при необходимости запустит новый. Ответ от @tasasaki отлично работает. - person donovan; 19.06.2014

Я не уверен, как скрыть клавиатуру программно, но, как вы знаете, я недавно опубликовал образец того, как запускать (как в, показывать) сенсорную клавиатуру в приложениях WPF, когда пользователь нажимает в текстовое поле, здесь:

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

В этом примере замечательно то, что он не требует использования Process и вместо этого использует поддерживаемый Windows 8 API для запуска сенсорной клавиатуры для элементов управления TextBox с помощью автоматизации.

Я работал над этим много месяцев, и я рад, наконец, внести этот пример в наше сообщество. Пожалуйста, дайте мне знать, если есть какие-либо вопросы, предложения, проблемы и т. Д. В образце панели вопросов и ответов

person Dmitry Lyalin    schedule 13.12.2013

Возможно, вы сможете попробовать решение, опубликованное в этом блоге: http://mheironimus.blogspot.nl/2015/05/adding-touch-keyboard-support-to-wpf.html

Он содержит некоторые из вещей, о которых вы просили (и многое другое):

  • Показать и скрыть клавиатуру
  • Переместить фокус с помощью FrameworkElement.BringIntoView ()
  • FrameworkElement.InputScope свойство, чтобы выбрать, какую раскладку клавиатуры отображать (числовую, электронную почту, URL-адрес и т. Д.)
person pogosama    schedule 30.06.2015

Попробуй это

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

Я надеюсь, что это поможет вам.

person Amirhossein Yari    schedule 21.02.2015

Это должно сработать, чтобы открыть, а затем убить процесс.

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

Завершение процесса закроет его.

Однако при отладке и пошаговом выполнении этих двух строк возникает та же ошибка, о которой вы упомянули выше - «Процесс завершился, поэтому информация о запросе недоступна».

Если вы не перейдете через эти две строки во время отладки, исключение не будет создано, и экранная клавиатура будет отключена.

Если вы используете CloseMainWindow(), клавиатура не закроется. CloseMainWindow() для процессов с пользовательским интерфейсом, так что можно подумать, что это было бы эффективно, но, возможно, поскольку клавиатура является частью ОС, это не в счет.

Подтвердите, что это работает, затем бросьте proc.Kill() в пробную ловушку с регистрацией ошибок для спокойствия.

person jporcenaluk    schedule 03.12.2013
comment
Как отмечено в другом комментарии, табуляция особенная, поэтому она не работает. - person donovan; 19.06.2014