我正在尝试使用事件点击来创建一个OS X程序,该程序将监听以音译形式输入的意第绪语并将结果发布为希伯来语字符。我制作了一个非常简短的程序来测试我必须做的一件事:http://pastie.org/791398
按原样,程序用'w'成功替换每个键入的'q':
if(inputString[0] == 'q') { inputString[0] = 'w'; }
但是如何发布一个多个字符的字符串?例如,如果有人输入'sh',你可能必须发布退格(删除仅为's'发布的字符),然后发布与'sh'对应的字符。但是,此代码仅导致发布退格:
else if(inputString[0] == 'm') { inputString[0] = '\b'; inputString[1] = 'n'; }
如果这些是基本问题,我道歉;我已经阅读了所有可以找到的文档,但我可能还没有完全理解。我也可能完全以错误的方式解决这个问题。
答案 0 :(得分:2)
理想情况下,您应该使用输入法而不是使用事件点击的程序,如果您不需要支持10.5之前的版本,则很可能使用Input Method Kit。为此目的使用事件抽头本身就是一个坏主意,因为用户可以使用鼠标和键盘更改他/她键入的位置。因此,如果用户在一个文本字段中键入“s”,在另一个文本字段中键入“h”,则无法区分。
那就是说,这是你问题的直接答案。
字符串是长度计数的,因此您不能只提供传入长度(1);第二个字符将被忽略。但是,大多数应用程序也不希望每个事件获得多个单个字符,因此它们只会丢弃剩余的字符。 (终端是一个值得注意的例外。)
所以你可以做的就是发布第二个包含第二个字符的事件。
else if(inputString[0] == 'm') {
inputString[0] = 'n';
CGEventKeyboardSetUnicodeString(event, 1, inputString);
CGEventPost(kCGSessionEventTap, event);
inputString[0] = '\b';
}
在一般情况下(模拟> 2个按键),您需要为要插入的每个字符创建一个事件。 This mailing list post包含一个简单示例。
答案 1 :(得分: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);