Frage

Ich habe über NSPasteBoard in der Apple-Dokumentation zu lesen, und wie es ermöglicht, Anwendungen zu schreiben in die PasteBoard und zulassen, dass andere Anwendungen diesen Text zu lesen und nutzen.

Kann mir jemand sagen, wie der Text von Uhr Anwendung einzufügen (die in der Statusleiste sitzt) in ein NSTextField, die in einer anderen Anwendung ist.

Was ich versuche zu tun, etwas ähnliches, was Snippet und SnippetsApp zu tun.

Wenn ich ganz dumm und offensichtlich in Apple-Docs verpasst haben, können Sie mir bitte auf den rechten Weg zeigen:)

Danke!

War es hilfreich?

Lösung

  

Kann mir jemand sagen, wie Text von Uhr-Anwendung einfügen in eine NSTextField (die in der Statusleiste sitzt), die in einer anderen Anwendung ist.

Einfügen ist das, was in der empfangenden Anwendung geschieht. Schreiben auf eine Pappe kopiert.

Darüber hinaus können Sie nicht davon ausgehen, dass der Benutzer in eine NSTextField einfügen wollen. Es kann eine NSTextView oder ein Textfeld in einem WebView oder eine Carbon-EditText oder MLTE Kontrolle oder einen anderen Texteditor wie Qt oder wxWidgets Texteditor sein. Sie können sogar eine App mit einer Listenansicht verwenden, die sie Text lassen einfügen direkt hinein.

So gibt es keine programmatische Möglichkeit, direkt eine Anwendung sagen, „hier ist ein Text - es einfügen, bitte“. Sie haben es auf die allgemeine Pappe zu kopieren und dann ein Ereignis schmieden, die im Allgemeinen die vorderste app verursachen sollten einzufügen. Charlie Vorschlag von ?V ist eine Möglichkeit, wenn auch heikel; das Dvorak-Layout setzt V auf eine andere Taste, während die „Dvorak QWERTY ?“ Layout setzt V-mit-? (im Gegensatz zu V-ohne-?) auf der gleichen Tonart wie QWERTY V.

, dass ?V Ereignis schmieden, Blick in CGEventTap . Sie werden verwenden müssen: der CGEventCreateKeyboardEvent Funktion das Ereignis selbst zu erstellen, und da diese Funktion einen Schlüsselcode nimmt, werden Sie müssen den richtigen Schlüsselcode für den V Teil der ?V Kombination suchen, die wird erfordern gehen durch Text Input Source Dienstleistungen oder Tastaturbelegung Dienstleistungen je nach Layout.

Sie an dieser Stelle könnte denken, Zugänglichkeit der Verwendung der Paste Menüpunkt im Menü Bearbeiten zu finden und eine AXPress Nachricht senden, aber „Einfügen“ und „Bearbeiten“ sind nur englische Worte für diese Konzepte; wenn Sie dies täte, würde Ihre Anwendung nicht in einer anderen Sprache arbeiten. Sie könnten im Auftrag (drittes Menü sechster Menüpunkt) gehen, aber dann Ihre App nicht funktionieren würde in Anwendungen ohne Menü Datei oder ohne Menüpunkt Redo, oder mit zwei Undo Menüpunkten (Photoshop). wirklich ein ?V Ereignis Schmieden ist der Weg zu gehen.

Andere Tipps

Hier einige Arbeitscode die ? + Schlüsselereignis (unter der Annahme eines bekannten keycode) zu schreiben:

// 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);  
}

Im Allgemeinen ist die einzige Möglichkeit ist, um es in den NSPasteboard zu schreiben und dann zu einer anderen App wechseln und einige Carbon-Funktionen drücken Sie „Befehl-V“ verwenden ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top