.NET Kiosk On-Screen Keyboard
Pergunta
Eu desenvolvi um OSK bastante simples para a nossa aplicação de quiosque. Ele funciona através da abertura sobre os acontecimentos OnFocus disparado por caixas de texto em nossa .net aplicativo. O problema é que estamos a tentar integrar-se com um single sign-on serviço que significa que estará abrindo um controle webbrowser para lidar com o terceiro autenticação festa. Desde as caixas de texto para a página de SSO estão dentro do controle de navegador, não estou inteiramente certo a melhor maneira de usar o OSK existente, ou se eu ainda posso.
Meus pensamentos iniciais são para tentar algum tipo de injeção javascript para adicionar eventos que a minha candidatura pode responder. Então eu deveria ser capaz de dizer quando uma caixa de texto recebe o foco, e abra a OSK. Uma vez que o OSK está fechada, eu posso atualizar campo de formulário com o valor que foi digitado. Meu problema com isto é que parece ser bastante frágil. Uma mudança em html / js na página SSO poderia mexer processo até o sign-in para todos os quiosques.
A outra opção que vejo é para acabar com o OSK eu tenho e usar um nível inferior. O problema que vejo com esta abordagem é o pobre Programabilidade do software OSK I parecem estar encontrando. Eu seria, essencialmente, precisa lançar uma festa de 3 exe sempre que eu precisava para obter a entrada do teclado do usuário e que não iria parecer tão suave de uma integração como eu poderia começar com a solução existente.
Eu poderia ir com uma mistura dos dois, usando o nosso OSK para controles WinForms normais e mudar para a 3ª OSK partido sempre que eu precisar usar o WebControl, mas eu acho que todo mundo podia ver o problema com essa abordagem.
Qualquer aconselhamento / sugestões sobre qual caminho a percorrer, e qualquer ajuda na implementação de uma injeção javascript genérico para permitir que eu use a minha OSK existente seria ótimo!
Solução
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);
}