Podría alguien decirme cómo pegar texto desde una aplicación (que se encuentra en la barra de estado) en un NSTextField que está dentro de una aplicación diferente.
Pegar es lo que sucede en la aplicación receptora. Escribir en una mesa de trabajo es copiar.
Además, no puede suponer que el usuario querrá pegar en un NSTextField. Puede ser un NSTextView, o un área de texto en un WebView, o un texto Carbon EditText o MLTE, o algún otro editor de texto como un editor de texto Qt o wxWidgets. Incluso pueden estar usando una aplicación con una vista de lista que les permite pegar texto directamente en ella.
Por lo tanto, no hay una forma programática de decirle directamente a una aplicación "aquí hay algo de texto, pégalo, por favor". Tienes que copiarlo en la mesa de trabajo general y luego forjar un evento que generalmente debería causar que la aplicación de más arriba pegue. La sugerencia de Charlie de ⌘V es una forma, aunque engañosa; el diseño de Dvorak coloca a V en otra tecla, mientras que el diseño "Dvorak QWERTY puts" coloca V-with-⌘ (en oposición a V-sin-⌘) en la misma tecla que QWERTY V.
Para forjar ese ⌘V evento, mira en CGEventTap. Tendrá que usar the CGEventCreateKeyboardEvent
function para crear el evento en sí mismo, y dado que esa función toma un código de tecla, necesitará buscar el código de clave adecuado para la parte V de la combinación ⌘V, que requerirá pasar por Text Input Source Services o Keyboard Layout Services, según el diseño.
En este momento puede pensar en usar Accesibilidad para encontrar el elemento del menú Pegar en el menú Editar y enviar un mensaje de AXPress, pero "Pegar" y "Editar" son solo palabras en inglés para esos conceptos; si hicieras esto, tu aplicación no funcionaría en ningún otro idioma. Podría ir por orden (tercer menú, sexto elemento del menú), pero luego su aplicación no funcionaría en aplicaciones sin un menú Archivo, o sin un elemento de menú Rehacer, o con dos elementos del menú Deshacer (Photoshop). Forjar un evento ⌘V realmente es el camino a seguir.
CGEventSourceRef no está funcionando mientras que yo he sandboxed mi solicitud. ¿Hay alguna forma de resolver el problema? – iPhoneDv
@iPhoneDv: debe hacer una pregunta por separado con más información sobre lo que está haciendo y qué problema encontró. –
Aquí hay un enlace no roto a la documentación de KeyboardLayoutServices: https://developer.apple.com/legacy/library/documentation/Carbon/Reference/KeyboardLayoutServices/ (Por supuesto, esto aún no fallará si el usuario se ha deshabilitado o cambiado el atajo de teclado para pegar?) – jtbandes