2

イベントタップを使用して、文字変換で入力されたイディッシュ語をリッスンし、結果をヘブライ文字で投稿する OS X プログラムを作成しようとしています。私がしなければならないことをテストするために、非常に短いプログラムを作成しました: http://pastie.org/791398

そのままで、プログラムは入力されたすべての 'q' を 'w' に正常に置き換えます。

if(inputString[0] == 'q') { inputString[0] = 'w'; }

しかし、複数の文字列を投稿するにはどうすればよいでしょうか。たとえば、誰かが 'sh' と入力した場合、('s' だけのために投稿された文字を削除するために) バックスペースを投稿してから、'sh' に対応する文字を投稿する必要があります。ただし、このコードではバックスペースのみがポストされます。

else if(inputString[0] == 'm') { inputString[0] = '\b'; inputString[1] = 'n'; }

これらが基本的な質問である場合は申し訳ありません。見つけたすべてのドキュメントを読みましたが、すべてを理解していない可能性があります。また、私がこれについて完全に間違った方法で行っている可能性もあります。

4

2 に答える 2

2

理想的には、イベント タップを備えたプログラムの代わりにインプット メソッドを使用する必要があります。10.5 より前のバージョンをサポートする必要がない場合は、インプット メソッド キットを使用する可能性が最も高いです。この目的でイベント タップを使用することは、本質的に悪い考えです。ユーザーはキーボードだけでなくマウスでも入力している場所を変更できるからです。したがって、ユーザーがあるテキスト フィールドに「s」を入力し、別のテキスト フィールドに「h」を入力した場合、その違いはわかりません。

とはいえ、これがあなたの質問に対する直接的な答えです。

文字列は長さでカウントされるため、受信した長さ (1) だけを提供することはできません。2 番目の文字は無視されます。ただし、ほとんどのアプリケーションは、イベントごとに複数の文字を取得することを好まないため、残りの文字を破棄します。(ターミナルは顕著な例外です。)

したがって、できることは、2 番目のキャラクターを含む 2 番目のイベントを投稿するだけです。

else if(inputString[0] == 'm') {
  inputString[0] = 'n';
  CGEventKeyboardSetUnicodeString(event, 1, inputString);
  CGEventPost(kCGSessionEventTap, event);
  inputString[0] = '\b';
}

一般的なケース (2 回以上のキー押下のシミュレーション) では、挿入する文字ごとにイベントを作成する必要があります。 このメーリング リストへの投稿には、簡単な例が含まれています。

于 2010-01-24T07:50:02.527 に答える
1

これは、最初の応答者 (フォアグラウンド アプリケーション) に文字列を送信する方法です。

// 1 - Get the string length in bytes.        
NSUInteger l = [string lengthOfBytesUsingEncoding:NSUTF16StringEncoding];

// 2 - Get bytes for unicode characters
UniChar *uc = malloc(l);
[string getBytes:uc maxLength:l usedLength:NULL encoding:NSUTF16StringEncoding options:0 range:NSMakeRange(0, l) remainingRange:NULL];

// 3 - create an empty tap event, and set unicode string
CGEventRef tap = CGEventCreateKeyboardEvent(NULL,0, YES);
CGEventKeyboardSetUnicodeString(tap, string.length, uc);

// 4 - Send event and tear down
CGEventPost(kCGSessionEventTap, tap);
CFRelease(tap);
free(uc);
于 2016-11-06T08:37:30.253 に答える