Establecer el diseño numérico para el teclado en pantalla de Windows mediante programación

En este momento, estoy tratando de programar en Google el diseño numérico para el teclado en pantalla de Windows 8.1, también llamado "teclado virtual" o "panel de entrada virtual (SIP)".

No es una solución WPF donde puedo configurar InputScope, pero estoy usando una aplicación JavaFX en una tableta con Windows 8.1. Sé que hay un teclado en pantalla incorporado para JavaFX, pero se requiere el estilo de metro SIP (tabtip.exe).

Mi solución actual se ve así; Simulo un clic del mouse en la esquina inferior izquierda del teclado donde está el botón "& 123" con C #. Compile este fragmento en un archivo .exe y llámelo desde JavaFX, p. cuando un TextField con entrada numérica recibe el foco. Esto tiene desventajas obvias:

1) es hacky

2) Si el teclado está en estado flotante y se movió o si hay alguna otra resolución de pantalla en su lugar, las coordenadas de clic podrían no estar en el lugar correcto.

3) La aplicación necesita privilegios elevados para generar eventos de mouse en el SIP

¿Cuál es una mejor manera de hacer esto?

Intenté usar Spy ++ para analizar y encontré un "TipSkinEvent" cuando presioné el botón "& 123".

Residencia enSe me ocurrió esto:

void ToggleNum()
{
    HWND hwndInputPanel = ::FindWindow(_TEXT("IPTip_Main_Window"), NULL);

    DWORD WM_NUM_BUTTON_PRESSED = ::RegisterWindowMessage(_TEXT("TipSkinEvent"));
    PostMessage(hwndInputPanel, WM_NUM_BUTTON_PRESSED, 0, 0);
}

Esto no funciona, y desafortunadamente no soy un experto en programación de Windows, por lo que no tengo idea de lo que hay que hacer aquí. ¿Me puede decir qué está mal en el fragmento o cuál es la API correcta para cambiar el diseño como se ve en la imagen de arriba? (Establecer el indicador numérico en el registro de Windows produce un diseño diferente, y también necesita derechos de administrador para matar y reiniciar tabtip.exe)

Para alternar la visibilidad del teclado, uso un enfoque similar (llamar al código C # compilado en un .exe). Esto funciona bien (¡incluso sin privilegios elevados!). Residencia en

Una nota al margen: también intenté usar JNA para omitir la llamada .exe sin éxito.

Respuestas a la pregunta(0)

Su respuesta a la pregunta