Подтвердить что ты не робот

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

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

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

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

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

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

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

Большое спасибо

4b9b3361

Ответ 1

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

[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 time to close the onscreen keyboard.
    closeOnscreenKeyboard();
}

Надеюсь, это поможет вам.

Ответ 2

Немного поздно, я просто улучшу пример tasaki для полного из того, что я сделал, чтобы включить/выключить событие gotFocus/LostFocus, когда пользователь нажимает на текстовое поле в моем приложении WPF для Windows 8 tablet.I надеюсь это помогает людям с аналогичной головной болью, потому что отключение 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 time to close the onscreen keyboard.
        CloseOnscreenKeyboard();
    }

Ответ 3

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

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

TabTipAutomation.BindTo<TextBox>();

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

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

Ответ 4

Ну, я бы попробовал что-то вроде этого

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

Ответ 5

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

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

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

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

Ответ 6

попробуйте этот

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

Надеюсь, это поможет вам.

Ответ 7

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

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

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

Ответ 8

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

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

Убийство процесса закроет его.

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

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

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

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