Pregunta

He leído sobre NSPasteBoard en la documentación de Apple, y cómo se permite que las aplicaciones para escribir en el PasteBoard y permitir que otras aplicaciones lee el texto y utilizarlo.

Podría alguien decirme cómo pegar texto de aplicación de la mañana (que se encuentra en la barra de estado) en un NSTextField que está dentro de una aplicación diferente.

Lo que estoy tratando de hacer es algo similar lo fragmentos y SnippetsApp hacer.

Si soy completamente estúpido y se perdió el obvia en Manzana Docs, ¿podría por favor que me señale el camino correcto:)

Gracias!

¿Fue útil?

Solución

  

Podría alguien decirme cómo pegar texto de aplicación de la mañana (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 un cartón está copiando.

Por otra parte, no se puede asumir que el usuario tendrá que pegar en un NSTextField. Puede ser una NSTextView, o un área de texto en un WebView, o un control de Carbon EditarTexto o MLTE, o algún otro editor de texto tal como un editor de texto Qt o wxWidgets. Incluso pueden estar usando una aplicación con una vista de la lista que les permite pegar texto directamente en ella.

Por lo tanto, no hay manera programática para decirle directamente una aplicación “aquí hay algo de texto - pegar, por favor”. Tienes que copiarlo en la mesa de trabajo general y luego forjar un evento que generalmente debe causar la aplicación situada en primer plano para pegar. sugerencia de ?V de Charlie es una manera, aunque sea complicado; la Dvorak pone de diseño V en otra clave, mientras que los “Dvorak QWERTY ?” pone de diseño V-con-? (en contraposición a V-sin-?) en la misma tecla como V de QWERTY.

Para forjar ese evento ?V, mirada en CGEventTap . Tendrá que usar la función CGEventCreateKeyboardEvent para crear el evento en sí, y desde esa función toma un código clave, tendrá que buscar el código de la llave adecuada para la parte V de la combinación ?V, que requerirán pasar por de introducción de texto Fuente Servicios o teclado disposición Servicios , dependiendo del diseño.

Es posible que en este momento pensar en el uso de Accesibilidad para encontrar el elemento de menú Pegar en el menú Editar y enviar un mensaje de AXPress, pero “Pegar” y “Editar” son sólo palabras de inglés por estos conceptos; Si hizo esto, su aplicación no funcionaría en cualquier otro idioma. Se podía ir por orden (tercer menú, el sexto elemento de menú), pero su aplicación no funcionaría en aplicaciones sin un menú Archivo, o sin un elemento de menú Rehacer, o con dos elementos de menú Deshacer (Photoshop). Forjar un evento ?V realmente es el camino a seguir.

Otros consejos

Aquí hay un código de trabajo para publicar el ? + evento clave (suponiendo un código clave se conoce):

// some common keycodes
#define KEY_CODE_x ((CGKeyCode)7)
#define KEY_CODE_c ((CGKeyCode)8)
#define KEY_CODE_v ((CGKeyCode)9)

void DCPostCommandAndKey(CGKeyCode key)
{
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE);
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand);
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown);
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp);

    CFRelease(keyUp);
    CFRelease(keyDown);
    CFRelease(source);  
}

En general, la única manera es escribir a la NSPasteboard y luego cambiar a otra aplicación y utilizar algunas funciones de carbono a la prensa "Comando-V" ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top