Как сделать так, чтобы Windows OSK открывалась, когда TextBox получает фокус, вместо того, чтобы требовать от пользователей касания значка клавиатуры?

Мы работаем над приложением WPF в .NET 4, которое будет использоваться с сенсорным экраном. Мы пытаемся использовать встроенную Windows OSK для нашего ввода, и последняя оставшаяся проблема заключается в том, чтобы заставить клавиатуру открываться, как только текстовое поле получает фокус. В настоящее время, если текстовое поле получает фокус, появляется небольшой значок клавиатуры (это значок InputPanel), и пользователь должен коснуться этого значка, чтобы открыть клавиатуру.

Есть ли способ пропустить шаг со значком и просто полностью открыть клавиатуру в фокусе? Предпочтительно что-то, что можно установить или закодировать в одном месте и применить ко всем текстовым полям по всему миру? Он также должен использовать текущие настройки культуры потока приложения (что, по-видимому, он уже делает).

Я не смог найти в настройках панели управления ничего, что позволяло бы пропустить шаг со значком. Я также нашел в Интернете несколько примеров использования TextInputPanel.CurrentInPlaceState, но когда я реализовал код для открытия TextInputPanel в фокусе предварительного просмотра главного окна, я продолжал получать исключения COM INTEROP и в основном заходил в тупик (файл Microsoft.Ink. dll — это интерактивная DLL).

Возможно ли, что есть раздел реестра, который может изменить CurrentInPlaceState по умолчанию на Expanded вместо HoverTarget? Я не смог найти ни одного в моем поиске сети.

Спасибо,

Валери

EDIT: Вот некоторый код, который я поместил в код главного окна, а также сообщение об исключении, которое я продолжаю получать, и я понятия не имею, что это значит или как это исправить (мои поисковые запросы в сети подвел меня!)

protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        base.OnPreviewGotKeyboardFocus(e);

        TextBox textbox = e.NewFocus as TextBox;
        TextBox oldTextbox = e.OldFocus as TextBox;

        if (oldTextbox != null && boxesToInputs.ContainsKey(oldTextbox))
        {
            TextInputPanel oldPanel = boxesToInputs[oldTextbox];
            oldPanel.Dispose();
            boxesToInputs.Remove(oldTextbox);
        }

        if (textbox != null)
        {
            // Make sure we've cleaned up old panels, just in case
            if (boxesToInputs.ContainsKey(textbox))
            {
                boxesToInputs[textbox].Dispose();
                boxesToInputs.Remove(textbox);
            }

            TextInputPanel newPanel = new TextInputPanel(((HwndSource)PresentationSource.FromDependencyObject(textbox)).Handle);
            newPanel.DefaultInPlaceState = InPlaceState.Expanded;
            newPanel.DefaultInputArea = PanelInputArea.Keyboard;
            boxesToInputs[textbox] = newPanel;
        }
    }

А вот сообщение об исключении, которое возникает, когда мой код вызывает конструктор TextInputPanel:

Не удалось получить фабрику классов COM для компонента с CLSID {F9B189D7-228B-4F2B-8650-B97F59E02C8C} из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Я проверил, что целевой платформой приложения WPF является x86. Я запустил Dependency Walker, и он сказал, что Microsoft.Ink.dll, который я использовал, был 64-разрядным, и что отсутствовали две загружаемые с задержкой зависимости (GPSVC.dll и IESHIMS.dll). Я нашел 32-разрядную версию Microsoft.Ink.dll, но по-прежнему получаю ту же ошибку, и Dependency Walker говорит то же самое — GPSVC.dll и IESHIMS.dll отсутствуют.

Я не могу ориентироваться на x64, и я бы предпочел не помещать отсутствующие библиотеки DLL в папку моего приложения (если это сработает?). Я надеюсь, что мне не хватает чего-то простого, потому что избавиться от подсказки на клавиатуре очень сложно...

Любая помощь приветствуется - я немного новичок, когда дело доходит до работы с неуправляемыми сборками/сборками взаимодействия...


person Valerie    schedule 22.09.2011    source источник
comment
Откуда вы берете класс TextInputPanel, я не вижу его в Microsoft.Ink.dll?   -  person CodingGorilla    schedule 22.09.2011
comment
Ах, кажется, у меня тоже была такая проблема, когда я впервые начал этот квест. Вы должны убедиться, что у вас установлена ​​самая новая версия Microsoft.Ink.dll... Я думаю, что я использую 6.1.7600.16385, а измененная отметка времени — 13.07.2009. Я нашел его в C:\Program Files(x86)\Common Files\microsoft shared\ink   -  person Valerie    schedule 23.09.2011
comment
Мне удалось найти программу TIPPopper, которая (после установки и запуска) заставит клавиатуру появляться без необходимости нажмите на значок - именно тот функционал, который я ищу. Однако мне нужно, чтобы эта функция была интегрирована в наше приложение WPF, а не работала извне. Автор, похоже, не сделал его открытым исходным кодом, хотя это бесплатное приложение.   -  person Valerie    schedule 23.09.2011
comment
У TIPPopper новый адрес skarv.net/tablet/tippopper.   -  person J Pollack    schedule 12.03.2015


Ответы (1)


Я исследовал для подобного предложения. В моем случае это было создание собственного OSK. Кажется, что (на данный момент) невозможно создать пользовательское устройство ввода. Объяснение находится по этой ссылке: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a813a08a-7960-45fe-bc91-e81cdb75bd10

Более того, я нашел «обходной путь», который использует вызовы Win32 API для доступа к методу SendKey и отчета о входных данных независимо от цели. Я нашел следующий проект: http://wosk.codeplex.com/.

SendKey также доступен в WinForms (см. http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx ), но я не уверен, что это приведет к такому же поведению.

Я проверю эти параметры в ближайшие дни, но, возможно, часть этой информации может помочь.

С уважением Хербер

person hmadrigal    schedule 23.09.2011
comment
Я сделал то же самое - я пытался использовать Windows OSK в приложении VB 2010 WPF, но в итоге это принесло больше проблем, чем того стоило. Мне действительно нужна была только цифровая клавиатура, поэтому я просто создал симпатичную маленькую сетку с цифровыми кнопками в многоразовом окне и передавал вывод туда, куда мне было нужно. - person evilspoons; 23.09.2011
comment
Наконец мы закончили создание пользовательского элемента управления в нашем проекте. Я написал образец на основе различных источников: Настраиваемая экранная клавиатура (OSK) для WPF wp. я/писку-40 - person hmadrigal; 27.12.2011