Как закрыть экранную клавиатуру из С# winform и отменить любые нажатия клавиш CTRL или ALT

Привет, у меня проблема с приложением сенсорного экрана .NET в Win7 (клавиатура ПК не подключена). Я использую часть приложения в качестве окна терминала для внешнего устройства. Когда открывается окно терминала, я запускаю экранную клавиатуру, вызывая: -

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
oskProcess = System.Diagnostics.Process.Start(onScreenKeyboardPath);

После того, как я закончил с окном терминала, я хочу закрыть форму одним щелчком мыши на X формы, который затем автоматически закроет экранную клавиатуру. Поэтому я звоню: -

Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
foreach (Process onscreenProcess in oskProcessArray)
{
    onscreenProcess.Kill();
    onscreenProcess.Dispose();
}

Это работает отлично, ЗА ИСКЛЮЧЕНИЕМ случаев, когда последней нажатой клавишей была клавиша CTRL, ALT или SHIFT. Если это так, они остаются «застрявшими» даже после того, как клавиатура убита. Если я перезапущу экранную клавиатуру, они все равно будут выделены.

Если я сначала нажму красный X на клавиатуре, прежде чем закрыть форму, все будет хорошо. Но я хочу/нужно закрыть оба вместе одним щелчком мыши из моего кода. Итак, как мне очистить любые «застрявшие» клавиши при выходе из клавиатуры автоматически, или есть другой способ сделать это?


person AHP    schedule 05.10.2015    source источник
comment
Вместо onscreenProcess.Kill(); попробуйте onscreenProcess.CloseMainWindow();... (не уверен, что это повлияет на вашу целевую платформу и/или целевое приложение, но это изящный способ попросить приложение закрыться).   -  person Idle_Mind    schedule 05.10.2015
comment
Спасибо @Idle_Mind. Это отклеивает CTRL и скрывает клавиатуру. Но мне нужно выйти из клавиатуры. Я попытался использовать onscreenProcess.CloseMainWindow(), чтобы изящно закрыть клавиатуру, а затем onscreenProcess.Kill(), чтобы выйти из клавиатуры, но это просто возвращается к застрявшему CTRL.   -  person AHP    schedule 06.10.2015


Ответы (1)


ОК, похоже, это решает проблему. Если я подожду довольно долго (1500 мс), а затем убью процесс, все, похоже, сработает !!!

Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
foreach (Process onscreenProcess in oskProcessArray)
{
    Application.DoEvents();
    onscreenProcess.CloseMainWindow();
    Application.DoEvents();
    Thread.Sleep(1500);
    onscreenProcess.Kill();
}
person AHP    schedule 06.10.2015
comment
Если кто-то решит пометить это как бесполезное, возможно, они могли бы объяснить, почему и дать то, что, по их мнению, является лучшим решением. - person AHP; 07.10.2015