Как правильно закрыть процесс экранной клавиатуры из C # winform?

2

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

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string keyboardPath = Path.Combine(progFiles, "TabTip.exe");
Process keyboardProc = Process.Start(keyboardPath);

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

Я попытался закрыть процесс следующим образом:

keyboardProc.Kill();
keyboardProc.Dispose();
keyboardProc.Close();
keyboardProc = null;

Ни один из них не работает и просто генерирует исключение:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll
Additional information: Cannot process request because the process has exited.

Я также пытался идентифицировать процесс по идентификатору и закрывать его таким образом, тоже не работал. Я также посмотрел:   С#/. NET: Закрытие другого процесса за пределами главного окна но не получило его работы..: (

Я новичок в С#, и это первый раз, когда я вызвал процесс Windows из кода - я что-то пропустил?

Спасибо вам заблаговременно!

  • 0
    .Kill() работает для меня. Вы уверены, что убили его только один раз, и больше вы ничего не делаете, что может вызвать исключение?
  • 0
    Вы пытались запустить свое приложение в качестве администратора?
Показать ещё 5 комментариев
Теги:
winforms
on-screen-keyboard
visual-studio-2012

4 ответа

1
Лучший ответ

u может делать:

            Process process = new Process();

            process.StartInfo.FileName = progFiles;//Filename
            process.Start();
            process.Close();
  • 0
    Пробовал, что: / Спасибо за ответ!
  • 0
    ты можешь добавить свой код? что у вас есть упоминание выше в вашем вопросе, это должно работать, или вы делаете что-то другое
Показать ещё 1 комментарий
2

У меня тоже были проблемы с этим. По какой-то причине это работает, хотя он убивает все открытые процессы TabTip.

            //Kill all on screen keyboards
            Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
            foreach (Process onscreenProcess in oskProcessArray)
            {
                onscreenProcess.Kill();
            }
1

Следующий код откроет/закроет Touch Keyboard в окне 10 быстрее, по сравнению с запуском/закрытием TabTip.exe напрямую. (тестируется на таблетках с низкой мощностью).

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindow(String sClassName, String sAppName);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, String lpszClass, String lpszWindow);

    /// <summary>
    /// Show the On Screen Keyboard
    /// </summary>
    #region ShowOSK
    public static void ShowOnScreenKeyboard()
    {
        IntPtr parent = FindWindow("Shell_TrayWnd", null);
        IntPtr child1 = FindWindowEx(parent, IntPtr.Zero, "TrayNotifyWnd", "");
        IntPtr keyboardWnd = FindWindowEx(child1, IntPtr.Zero, null, "Touch keyboard");

        uint WM_LBUTTONDOWN = 0x0201;
        uint WM_LBUTTONUP = 0x0202;
        UIntPtr x = new UIntPtr(0x01);
        UIntPtr x1 = new UIntPtr(0);
        IntPtr y = new IntPtr(0x0240012);
        PostMessage(keyboardWnd, WM_LBUTTONDOWN, x, y);
        PostMessage(keyboardWnd, WM_LBUTTONUP, x1, y);
    }
    #endregion ShowOSK

    /// <summary>
    /// Hide the On Screen Keyboard
    /// </summary>
    #region HideOSK
    public static void HideOnScreenKeyboard()
    {
        uint WM_SYSCOMMAND = 0x0112;
        UIntPtr SC_CLOSE = new UIntPtr(0xF060);
        IntPtr y = new IntPtr(0);
        IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
        PostMessage(KeyboardWnd, WM_SYSCOMMAND, SC_CLOSE, y);
    }
    #endregion HideOSK
1
    /// <summary>
    /// Show the On Screen Keyboard
    /// </summary>
    #region ShowOSK
    public static void ShowOnScreenKeyboard()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
        Process.Start(startInfo);
    }
    #endregion ShowOSK

    /// <summary>
    /// Hide the On Screen Keyboard
    /// </summary>
    #region HideOSK
    public static void HideOnScreenKeyboard()
    {
        uint WM_SYSCOMMAND = 274;
        uint SC_CLOSE = 61536;
        IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
        PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0);
    }
    #endregion HideOSK

Ещё вопросы

Сообщество Overcoder
Наверх
Меню