1

ここでこれについていくつか質問があったことは知っていますが、キーストロークを別のプロセスに送信するこのクラスメソッドがありますが、部分的に機能しているようです。@"mystring" の NSString を送信すると、"mmmmmmmm" が返されます (つまり、常に最初の文字が元の文字列の長さ倍になります)。これが私のコードです。誰かが私に欠けているものを教えてください。ちなみに、文字の NSLog は、バッファ変数にある正しい文字を示しています。私が見た他の質問 1. CGEventCreateKeyboardEvent および CGEventTapLocation 2.- CGEventPostToPSN - 異なるキーボード ロケールでキーを送信する方法は?

+(void)writeString:(NSString *)valueToSet withFlags:(int)flags intoProcess:(ProcessSerialNumberPtr) process 
{

  CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
  CGEventRef keyEventDown = CGEventCreateKeyboardEvent(source, 1, true);
  CGEventRef keyEventUp = CGEventCreateKeyboardEvent(source, 1, false);
  CGEventSetFlags(keyEventDown,0);                
  CGEventSetFlags(keyEventUp,0);
  UniChar buffer;
  CFRelease(source);
  for (int i = 0; i < [valueToSet length]; i++) {
    buffer = [valueToSet characterAtIndex:i];
    NSLog(@" %i place Character: %c",i,buffer);
    CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer);
    CGEventKeyboardSetUnicodeString(keyEventUp, 1, &buffer);

    CGEventSetFlags(keyEventDown,flags);
    CGEventPostToPSN(process, keyEventDown);
    [NSThread sleepForTimeInterval: 0.01];
    CGEventSetFlags(keyEventUp,flags);
    CGEventPostToPSN(process, keyEventUp);
    [NSThread sleepForTimeInterval: 0.01];

  }
  CFRelease(keyEventUp);
  CFRelease(keyEventDown);
}
4

1 に答える 1

0

同じスレッドで、コード内の別の場所にイベント タップを設定していますか? はいの場合、これが起こっている可能性があります。

イベントを投稿しましたが、それらを処理してイベント チェーンを介して送信するはずのスレッドがブロックされています。したがって、基本的には、イベントの送信とブロックを同時に行います。この場合、タイマーを使用してイベントを 1 つずつ送信し、イベント タップが送信した同じイベントを処理できるようにする必要があります。

于 2012-07-03T11:35:43.530 に答える