2011-07-24 16 views
8

El teclado en pantalla en Windows 7 le permitirá mantener el foco en un cuadro de texto mientras escribe con el teclado. En C# y .Net, ¿cómo puedo forzar a que otra aplicación retenga el foco mientras acepta entradas como el teclado en pantalla Win7? O tal vez una mejor manera de decirlo, ¿cómo puedo hacer que mi aplicación no se concentre cuando interactúas?No se enfoca, pero ¿permite la interacción?

He intentado LockSetForegroundWindow y no he visto ningún resultado.

+0

WinForms o WPF? – BoltClock

+0

WPF preferiblemente. –

Respuesta

14

Tienes que establecer el estilo extendido de WS_EX_NOACTIVATE en tu ventana. La forma más fácil es mediante el uso de P/Invoke.

private const int WS_EX_NOACTIVATE = 0x08000000; 
private const int GWL_EXSTYLE = -20; 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int GetWindowLong(IntPtr hwnd, int index); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); 

... 

var window = new Window(); 
window.SourceInitialized += (s, e) => { 
    var interopHelper = new WindowInteropHelper(window); 
    int exStyle = GetWindowLong(interopHelper.Handle, GWL_EXSTYLE); 
    SetWindowLong(interopHelper.Handle, GWL_EXSTYLE, exStyle | WS_EX_NOACTIVATE); 
}; 
window.Show(); 

También puede utilizar WPF clase de interoperabilidad HwndSource para crear la ventana. Su constructor acepta el estilo de ventana extendida.

+0

Estoy trabajando ahora mismo y no puedo probar esto, pero estoy muy entusiasmado con una solución simple como esta. Cuando llegue a casa, escribiré esto e informaré sobre cómo funciona. –

+2

Funciona increíblemente. –

+0

Solo tenga en cuenta que si la ventana tendrá relación parent \ owner con cualquier otra ventana que no sea este indicador WS_EX_NOACTIVATE será ignorado. – Evgeny

Cuestiones relacionadas