AppleScriptで特殊文字をキーストロークすることは可能ですか?


6

不具合:

特定の特殊文字と記号の場合、AppleScriptはkeystroke実際の文字に失敗し、代わりに単に文字を入力しaます。


例:

次のAppleScriptコード:

tell application "System Events" to keystroke "² ³ é ½ ₭"

次のテキスト文字列を入力します(どのアプリケーションを使用している場合でも)。

a a a a a

回避策:

次のように、特殊文字をクリップボードに配置してからクリップボードを貼り付けることで、テキストを効果的に「入力」できます。

set the clipboard to "² ³ é ½ ₭"
tell application "System Events" to keystroke "v" using command down

上記の方法を使用してAppleScriptのクリップボードにテキストを配置することは避けます。これは、プロセス中にクリップボードをリッチテキストに変換する必要があるためです。

ここ提供される方法を使用してプレーンテキストがクリップボードに確実に配置されるようにします。ただし、このメソッドは特殊文字を文字組みに変換します。

たとえば、上記と同じ文字列を使用して、このメソッドはクリップボードに次のテキストを配置します。

² ³ é ½ ₭

ただし、replace_chars特殊文字ごとにステートメントを追加することにより、この問題を手動で説明できます。


質問:

クリップボードを使用せずに、AppleScript経由で特殊文字を入力する方法はありますか?

たとえば、目的の特殊文字をどこかに「銀行」またはシステムファイルに追加して、System Eventsアプリケーションがそれらに精通できるようにする方法はありますか?


回答:


7

CoreGraphicsCGEventPost)では可能ですが、C API(Cocoa-AppleScriptでは動作しません)ですが、AppleScriptから実行可能ファイルを呼び出すことは可能です。


Xcode(バージョン8.3.3)で実行可能ファイルを作成する方法は次のとおりです。

自分で行う(App StoreからXcodeをダウンロードする)か、信頼できる人に実行可能ファイルの作成を依頼することができます。

1- Xcodeを開き、メニュー「ファイル」->「新規」->「プロジェクト ...」を 選択しますここに画像の説明を入力してください


2- macOSコマンドラインツールを選択し、[ 次へ ]ボタンをクリックします。 ここに画像の説明を入力してください


3-名前を付けてTypeCharacters、言語としてObjective-Cを選択し、「次へ」ボタンをクリックします。 ここに画像の説明を入力してください


4-プロジェクトを目的のフォルダーに保存します。


5- Xcodeのウィンドウで、main.mアイコンを選択し、ウィンドウ内のテキストをクリアして、次の2つのコードのいずれかを貼り付けます:

バグ、CGEventKeyboardSetUnicodeString()メソッドが20文字を超える文字列を切り捨てる、または制限(ドキュメント化されていない)のため、コードにループが必要です。

このコードはループを使用して、各反復で文字のリストを入力します。リストには1〜20文字を含めることができます。(私のコンピューターのTextEditの文書に2400文字を入力するのに1秒かかります。)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        if (argc > 1) {
            NSString *theString = [NSString stringWithUTF8String:argv[1]];
            NSUInteger len = [theString length];
            NSUInteger n, i = 0;
            CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
            unichar uChars[20];
            while (i < len) {
                n = i + 20;
                if (n>len){n=len;}
                [theString getCharacters:uChars range:NSMakeRange(i, n-i)];
                CGEventKeyboardSetUnicodeString(keyEvent, n-i, uChars);
                CGEventPost(kCGHIDEventTap, keyEvent); // key down
                CGEventSetType(keyEvent, kCGEventKeyUp);
                CGEventPost(kCGHIDEventTap, keyEvent); // key up (type 20 characters maximum)
                CGEventSetType(keyEvent, kCGEventKeyDown);
                i = n;
                [NSThread sleepForTimeInterval:0.004]; // wait 4/1000 of second, 0.002 it's OK on my computer, I use 0.004 to be safe, increase it If you still have issues
            }
            CFRelease(keyEvent);
        }
    }
    return 0;
}

このコードはループを使用して、各反復で1文字を入力します(最初のコードよりも遅いです)。

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        if (argc > 1) {
            NSString *theString = [NSString stringWithUTF8String:argv[1]];
            UniChar uChar;
            CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
            for (int i = 0; i < [theString length]; i++)
            {
                uChar = [theString characterAtIndex:i];
                CGEventKeyboardSetUnicodeString(keyEvent, 1, &uChar);
                CGEventPost(kCGHIDEventTap, keyEvent); // key down
                CGEventSetType(keyEvent, kCGEventKeyUp);
                CGEventPost(kCGHIDEventTap, keyEvent); // key up (type the character)
                CGEventSetType(keyEvent, kCGEventKeyDown);
                [NSThread sleepForTimeInterval:0.001]; // wait 1/1000 of second, no need of this line on my computer, I use 0.001 to be safe, increase it If you still have issues
            }
            CFRelease(keyEvent);
        }
    }
    return 0;
}

:このコードはmacOS Sierra動作しEl Capitan では動作するはずですが、古いOSでは動作しません。

ここに画像の説明を入力してください


6- [メニュー] [ 製品 ] -> [ ビルド ]を選択します。


7- 製品フォルダのTypeCharactersアイコンを選択し、右クリックして、コンテキストメニューの[ Finderに表示]メニューを選択します。

ここに画像の説明を入力してください


8- Finderから「TypeCharacters」ファイルを目的のフォルダーに移動し、Xcodeを終了します。


AppleScriptから、次のように実行可能ファイルを呼び出します

set myString to "ùéèà ² ³ é ½ ₭ "
do shell script "'/full path/of/TypeCharacters' " & quoted form of myString

信じられないほどの答え。このソリューションはOS X 10.11.6でも問題なく機能します。より良い解決策を夢見ることはできませんでした。詳細なスクリーンショットもありがたいです。とても感謝しています!!!
ルービックの球

バグを発見しました。長さmyStringが20文字を超える場合、文字列は切り捨てられます。つまり、20番目の文字に続くテキストは入力されません。これを修正する方法を知っていますか?
ルービックの球

ここで、ループを使用して各文字を入力し(2000文字以上の文字列でテスト)、回答のコードを更新しました。
jackjr300

新しいソリューションが問題を解決しました。ありがとう!補足として、#import <Foundation/Foundation.h>編集でコードから行を削除しましたが、ビルドを成功させるにはこの行が必要です。このコード行はデフォルトで存在することは知っていますが、「ウィンドウ内のテキストをクリア
ルービックの球

新しいソリューションには新しいバグがあると思います。頻繁に、入力されたテキストに文字が欠落したり、テキストの順序が変更されたりします。これは、文字列の長さに関係なく発生します。実際の例= 278,932は次のとおりです。TypeCharactersファイルに指定された文字列は入力されましたが、次の文字列が入力されました: =2 78,93
ルービックの球体

4

回避策(クリップボードを使用):

1-シェルからココアメソッドを使用できます。

set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    do shell script "/usr/bin/python -c 'import sys;from AppKit import NSPasteboard, NSPasteboardTypeString; cb=NSPasteboard.generalPasteboard();cb.declareTypes_owner_([NSPasteboardTypeString], None);cb.setString_forType_(sys.argv[1].decode(\"utf8\"), NSPasteboardTypeString)' " & quoted form of t1
end stringToClipboard

2-またはCocoa-AppleScriptアプレット:

use framework "AppKit"
use scripting additions
set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    set ca to current application
    set cb to ca's NSPasteboard's generalPasteboard()
    cb's declareTypes:{ca's NSPasteboardTypeString} owner:(missing value)
    cb's setString:t1 forType:(ca's NSPasteboardTypeString)
end stringToClipboard

3

keystrokeキャラクターにするには、そのキャラクターを選択したキーボードの実際のキーにマッピングする必要があります。

たとえば、フランス語とPCキーボードレイアウトを使用しているため、keystroke é²で問題ありません。ただし、標準のアメリカQWERTYキーボードはこれらのキーを備えておらず、使用できません。keystroke


2

このように、すべての特殊文字セットを変数として定義できます

on specialKeys(input)
    tell application "System Events"
        keystroke input
    end tell
end specialKeys


set characterSet1 to "²³é½₭ "
set characterSet2 to "³ "
set characterSet3 to "é "
set characterSet4 to "¬Ω "
set characterSet5 to "₭ "
set characterSet6 to characterSet1 & characterSet2 & characterSet3 & characterSet4 & characterSet5

specialKeys(characterSet1)
-- ² ³ é ½  is the result from calling specialKeys(characterSet1) After adding the text replacement for a a a a a in my keyboard preferences

一部の特殊文字は、変数として設定すると正しくキーストロークされます。キーストロークが適切に行われない変数として設定した特殊文字は、キーボードのシステム環境設定で「テキスト置換」を追加できます。

必ずすべてのアイテムを選択して、デスクトップまたはどこにでもドラッグしてください。これにより、元の設定のバックアップとなる.plistファイルが作成されます。このファイルはいつでもドラッグして戻すことができます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

次に、ScriptEditorで、編集メニューの「置換」サブメニューでテキスト置換が有効になっていることを確認します。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


2
「テキスト置換」 OS Xアプリケーション(例えば、テキストエディット、メモ、スクリプトエディタなど)の大部分で、必要に応じて回避策は動作しますが、私は仕事にするソリューションを期待していたすべての任意のアプリケーションでテキストフィールド。たくさんお願いします、知っています!私はまだこれは非常に賢い解決策だと思うので、+ 1。答えてくれてありがとう。
ルービックの球
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.