【问题标题】:How to send keystrokes to another process in objective-c如何在objective-c中将击键发送到另一个进程
【发布时间】:2012-05-17 05:29:49
【问题描述】:

我知道这里有一些关于此的问题,但我有这个类方法可以将击键发送到另一个进程,但它似乎部分工作。如果我发送 @"mystring" 的 NSString,我会返回 "mmmmmmmm"(即总是第一个字母乘以原始字符串的长度倍数)。这是我的代码,请有人告诉我我缺少什么。顺便说一下,字符的 NSLog 显示缓冲区变量中的正确字符。 我看过的其他问题 1.CGEventCreateKeyboardEvent and CGEventTapLocation 2.-CGEventPostToPSN - How to send keys with different keyboard locales?

+(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);
}

【问题讨论】:

  • 那么如何调用你的函数呢?

标签: objective-c macos cocoa keystroke


【解决方案1】:

您是否在代码的其他位置,在同一个线程上设置了事件点击?如果是,这就是可能发生的情况:

您发布了一个事件,但是应该处理它们并通过事件链发送它们的线程被阻塞了。所以基本上你发送事件并同时阻止它们。如果是这种情况,您应该使用计时器并一一发送事件,以允许您的事件点击处理您刚刚发送的相同事件。

【讨论】:

  • 不,程序的任何部分都没有设置事件点击。该程序并非旨在检查击键或事件,只是为了将它们发送到 PSN。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多