Вопрос

Я разработал довольно простую OSK для нашего киоск-приложения.Он работает, открывая события onfocus, запускаемые текстовыми полями в нашем .net-приложении.Проблема в том, что мы пытаемся интегрироваться со службой единого входа, что означает, что мы откроем элемент управления веб-браузером для обработки сторонней аутентификации.Поскольку текстовые поля для страницы единого входа находятся внутри элемента управления браузера, я не совсем уверен, как лучше всего использовать существующий OSK, и смогу ли я вообще это сделать.

Моя первоначальная мысль состоит в том, чтобы попробовать какую-то инъекцию JavaScript, чтобы добавить события, на которые мое приложение может реагировать.Тогда я смогу определить, когда текстовое поле получает фокус, и открыть OSK.После закрытия OSK я могу обновить поле формы введенным значением.Моя проблема в том, что он кажется довольно хрупким.Изменение html/js на странице единого входа может испортить процесс входа во всех киосках.

Другой вариант, который я вижу, — отказаться от имеющегося у меня OSK и использовать OSK более низкого уровня.Проблема, которую я вижу в этом подходе, заключается в плохой программируемости программного обеспечения OSK, которое я, кажется, нахожу.По сути, мне нужно было бы запускать сторонний exe всякий раз, когда мне нужно было получить ввод с клавиатуры от пользователя, и это не было бы такой гладкой интеграцией, как я мог бы получить с существующим решением.

Я мог бы использовать сочетание этих двух вариантов, используя наш OSK для обычных элементов управления Winforms и переключаясь на сторонний OSK всякий раз, когда мне нужно использовать веб-управление, но я думаю, что каждый может увидеть проблему с этим подходом.

Любые советы/предложения о том, куда идти, и любая помощь по реализации универсальной инъекции JavaScript, позволяющей мне использовать существующий OSK, были бы великолепны!

Это было полезно?

Решение

private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.ObjectForScripting = this;
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoadComplete);
    webBrowser1.Navigate("http://www.google.com");
}

public void LoadComplete(object sender, WebBrowserDocumentCompletedEventArgs args)
{
    foreach(HtmlElement input in webBrowser1.Document.GetElementsByTagName("input"))
    {
        if (input.GetAttribute("type").ToLower() == "text")
        {
            input.Click += new HtmlElementEventHandler(Clicked);
        }
    }
}

public void Clicked(object sender, HtmlElementEventArgs args)
{
    // Show OSK, Get Results Text
        (sender as HtmlElement).SetAttribute("value", oskText);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top