¿Cómo controlo el panel de entrada de texto mediante progtwigción (TabTip.exe) en Windows Vista / 7?

Estoy adaptando una aplicación para la interfaz de pantalla táctil y queremos usar el panel de entrada de texto de la tableta incluido en Windows Vista / 7, específicamente su teclado. Quiero mostrarlo y ocultarlo según corresponda para mi aplicación. Básicamente quiero las ShowKeyboard() y HideKeyboard() . ¿Cuál es la mejor manera de controlar esto?

Miré la API de ITextInputPanel pero no pude controlar el teclado directamente con ella (¿tal vez me perdí algo?). También he intentado sin éxito enviar mensajes de ventana a su ventana.

La aplicación está escrita en C ++ / MFC.

Cualquier puntero en absoluto es muy apreciado.

Resolví el problema. Resulta que Spy ++ es realmente el mejor amigo de los progtwigdores de Windows.

Primero, la clase de ventana de la ventana del panel de entrada resulta ser “IPTip_Main_Window”. Yo uso esto para obtener el identificador de la ventana de esta manera:

 HWND wKB = :: FindWindow (_TEXT ("IPTip_Main_Window"), NULL);

Resulta que solo puedo publicar los mismos mensajes WM_COMMAND que envía su propio menú. La mayoría de las operaciones están disponibles en el menú: superior del muelle, inferior del muelle y flotador. El código para enviar esos mensajes es:

 :: PostMessage (wKB, WM_COMMAND, MAKEWPARAM (X, 0), 0);

donde X es 10021 para el fondo del muelle, 10023 para la parte superior del muelle y 10020 para flotar. El 0 en la palabra alta indica que el mensaje se envía desde un menú.

Finalmente, quería poder mostrar y ocultar el panel de entrada. Noté que podía activar una banda de escritorio que solo incluye un botón para alternar la visibilidad del panel de entrada. El espionaje de los mensajes publicados desde este botón reveló que envía un mensaje de ventana registrado global que se llama “TabletInputPanelDeskBandClicked”. El envío de este mensaje al panel de entrada hace que cambie su visibilidad.

La función HideKeyboard () ahora se ve así:

 DWORD WM_DESKBAND_CLICKED =
     :: RegisterWindowMessage (_TEXT ("TabletInputPanelDeskBandClicked"));

 void HideKeyboard ()
 {
     HWND wKB = :: FindWindow (_TEXT ("IPTip_Main_Window"), NULL);
     if (wKB! = NULL && :: IsWindowVisible (wKB))
     {
         :: PostMessage (wKB, WM_DESKBAND_CLICKED, 0, 0);
     }
 }

La función ShowWindow () se implementa de manera similar, pero también iniciará el teclado si no se está ejecutando.

Actualizar:

Parece que esta mensajería entre procesos no está permitida en Windows Vista / 7. Cuando se ejecuta este comando en un proceso no elevado, fallará con “acceso denegado”. Supongo que esto se debe a la protección de aislamiento de procesos de interfaz de usuario (UIPI) que se encuentra en Windows Vista / 7. Dado que el Panel de entrada de Tablet PC se ejecuta como un proceso secundario de un servicio, tiene un nivel de integridad más alto que los progtwigs del usuario y, por lo tanto, no se puede enviar ningún mensaje (o un conjunto muy limitado de) a.

Actualizar:

Resulta que el Panel de entrada de Tablet PC se está ejecutando en un alto nivel de integridad, mientras que los procesos iniciados por una cuenta de usuario limitada tienen un nivel de integridad medio.

Para Windows 8:

Nota: Al igual que la solución de Windows 7, esto requiere un proceso elevado.

El panel de entrada no es un descendiente de HWND_DESKTOP. (Probablemente sea algún tipo de ventana de Metro). Para obtener el identificador de la ventana, realice una serie de barridos horizontales en un patrón de prueba de cuadrícula con WindowFromPoint (). Para cada prueba, verifique la clase de ventana de la ventana primaria para ver si es “IPTip_Main_Window”.

Para mostrar el panel de entrada, inicie "C:\\Program Files\\Common Files\\microsoft shared\\ink\\tabtip.exe" . Para determinar si ya está en modo acoplado, lea la clave de registro:

 HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7\EdgeTargetDockedState 

Un valor de 0 indica que el panel de entrada está en modo flotante. Si ese fue el caso, publique el siguiente mensaje para alternar el estado acoplado:

 DWORD WM_DOCK_BUTTON_PRESSED = ::RegisterWindowMessage(_TEXT("IPTipDockButtonPressed")); PostMessage(hwndInputPanel, WM_DOCK_BUTTON_PRESSED, 0, 0); 

Para ocultar el teclado, publica lo siguiente:

 PostMessage(hwndInputPanel, WM_SYSCOMMAND, SC_CLOSE, 0); 
    Intereting Posts