2012-05-17 24 views
1

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

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

回答

0

你有一个事件自来水设立其他地方的代码,在同一线程上?如果是,则可能发生以下情况:

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

+0

不,在程序的任何部分都没有设置事件分接点。程序不是用来检查键击或事件,而只是将它们发送到PSN。 – AnonymousPlayer

相关问题