Teclado en pantalla

02/03/2009 - 13:58 por oaoeoo | Informe spam
Hola, necesito disponer de un teclado en pantalla para unas
aplicaciones que van en pantalla táctil. El de Windows, OSK, no me
vale, pues tiene las teclas muy pequeñas. He hecho un ejecutable con
un diseño de teclas más grandes, pero ahora no sé cómo enviar la tecla
pulsada a la aplicación que esté activa. ¿Dónde puedo encontrar algo?
Saludos.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
02/03/2009 - 14:39 | Informe spam
wrote in message
news:
[...] no sé cómo enviar la tecla
pulsada a la aplicación que esté activa.



La instrucción SendKeys.Send(teclas) envía las teclas indicadas a la
apliación cuya ventana se encuentre activa en ese momento.
SendKeys está en el espacio de nombres System.Windows.Forms.
Respuesta Responder a este mensaje
#2 oaoeoo
02/03/2009 - 16:34 | Informe spam
On 2 mar, 14:39, "Alberto Poblacion" <earthling-
wrote:
wrote in message

news:

> [...] no sé cómo enviar la tecla
> pulsada a la aplicación que esté activa.

    La instrucción SendKeys.Send(teclas) envía las teclas indicadas a la
apliación cuya ventana se encuentre activa en ese momento.
    SendKeys está en el espacio de nombres System.Windows.Forms.



Así lo tenía en un principio, para probarlo me abro el Word, pero no
me hace nada.
Tengo puesto por ejemplo en el botón que representa la A ->
SendKeys.Send("A"). ¿Qué hago mal? El formulario está siempre en
primer plano, lo que no sé es si al pulsar la A, la aplicación Activa
pasa a ser el propio teclado y no el Word, ¿puede ser algo de esto?
Gracias Alberto
Respuesta Responder a este mensaje
#3 Alberto Poblacion
02/03/2009 - 16:49 | Informe spam
wrote in message
news:
Tengo puesto por ejemplo en el botón que representa la A ->
SendKeys.Send("A"). ¿Qué hago mal? El formulario está siempre en
primer plano, lo que no sé es si al pulsar la A, la aplicación Activa
pasa a ser el propio teclado y no el Word, ¿puede ser algo de esto?



Sí, claro. En cuanto haces click sobre el teclado, éste pasa a ser la
aplicación activa, por lo que si haces a continuación un SendKeys, las
teclas le llegan al propio teclado, y no al Word. Antes de ejecutar el
comando SendKeys, tendrás que ejecutar las instruccíones necesarias para
activar el Word. Una forma de conseguirlo es mediante la API
"SetForegroundWindow". Hay múltiples ejemplos de cómo se usa, por ejemplo
aquí tienes uno:
http://msdn.microsoft.com/es-es/lib...71548.aspx
Respuesta Responder a este mensaje
#4 FrancisF.
02/03/2009 - 17:56 | Informe spam
Alberto, siento molestar más, pero no me responde como espero, te copio el
código que tengo:
[STAThread]
static void Main()
{
Application.Run(new formTeclado());
}
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void simpleButton6_Click(object sender, System.EventArgs e)
{
// Get a handle to the Wordulator application. The window class
// and window name were obtained using the Spy++ tool.
IntPtr Word = FindWindow("OpusApp", "Documento1 - Microsoft Word");

// Verify that Wordulator is a running process.
if (Word == IntPtr.Zero)
{
MessageBox.Show("Abrir el word en blanco");
return;
}

// Mandar la tecla
SetForegroundWindow(Word);
SendKeys.SendWait("ATA LA JACA");

}



Cuando lo ejecuto y pulso la tecla que contiene el código, no pinta el texto
en word hasta que no pulso unas cuantas veces, y no siempre que pulso lo
pinta.

En otro orden de cosas, ¿una aplicación creada en c# tiene una clase
específica? es para saber cómo buscar una aplicación de esa clase y enviar
las teclas a esa aplicación, en lugar de buscar como hago en el ejemplo por
clase y nombre de ventana.
Gracias por la paciencia.
Respuesta Responder a este mensaje
#5 oaoeoo
02/03/2009 - 18:03 | Informe spam
(igual sale repetido el post, no estoy seguro de haber enviado el
anterior)

Tengo el siguiente código, tomado del ejemplo que me indicabas:
[STAThread]
static void Main()
{
Application.Run(new formTeclado());
}
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void simpleButton6_Click(object sender, System.EventArgs e)
{
// Get a handle to the Wordulator application. The window class
// and window name were obtained using the Spy++ tool.
IntPtr Word = FindWindow("OpusApp", "Documento1 - Microsoft Word");

// Verify that Wordulator is a running process.
if (Word == IntPtr.Zero)
{
MessageBox.Show("Abrir el word en blanco");
return;
}

// Mandar la tecla
SetForegroundWindow(Word);
SendKeys.SendWait("ATA LA JACA A LA ESTACA");

}

los resultados no son los esperados, sólo se envía el texto al word
aleatoriamente, no en cada pulsación de la tecla (en este caso botón),
y no es siempre en la primera pulsación. Te indico que uso C# en .Net
2003 (aunque lo he probado en .NET 2005 también) y XP (por si tiene
que ver al hacer uso del API).
Otra cosa, en el ejemplo se manda el foco buscando la ventana activa
según la clase y el título de la ventana, me pregunto si cada
aplicación construída en C# tiene una clase propia y si se puede
buscar por esa clase teniendo en cuenta que no va a haber dos
ejecuciones de la aplicación.
Gracias por tu paciencia y colaboración.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida