我正在尝试使用事件点击来创建一个 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'; }

如果这些是基本问题,我深表歉意;我已阅读了我能找到的所有文档,但我可能无法全部理解。也有可能我的处理方式完全错误。

有帮助吗?

解决方案

理想情况下,您应该使用输入法而不是带有事件点击的程序,最有可能使用 输入法套件 如果您不需要支持 10.5 之前的版本。为此目的使用事件点击本质上是一个坏主意,因为用户可以更改他/她使用鼠标和键盘键入的位置。因此,如果用户在一个文本字段中输入“s”,然后在另一个文本字段中输入“h”,您将无法分辨出区别。

也就是说,这是对你的问题的直接回答。

字符串是按长度计算的,因此不能只提供传入长度 (1);第二个字符将被忽略。然而,大多数应用程序也不喜欢每个事件获取多个字符,因此它们只会丢弃剩余的字符。(终端是一个值得注意的例外。)

因此,您可以做的就是简单地发布第二个事件,其中包含第二个角色。

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

在一般情况下(模拟 > 2 次按键),您需要为要插入的每个字符创建一个事件。 此邮件列表帖子 包括一个简单的例子。

其他提示

这是我如何发送一个字符串,该第一响应者(前台应用程序)

// 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top