如何将字符串转换为一系列击键?

时间:2010-07-02 23:02:47

标签: objective-c cocoa keyboard

我正在使用CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)55, true);来模拟按键,但我说我有一个字符串,我想转换为按键。我如何将NSString分成单个字符,然后将它们转换为按键?谢谢!

编辑:好的我认为我找到了解决方案,但我无法正确使用语法。 Objective-C真让我疯狂。

这是我的代码:

int stringLength = [theData length];
  for (int i = 1; i <= stringLength; i++) {
   char *currentCharacter = [theData characterAtIndex:i];
   CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)keyCodeForKeyString(currentCharacter), true);
}

-(int)keyCodeForKeyString:(char *)keyString
{
 if (strcmp(keyString, "a") == 0) return 0;
 if (strcmp(keyString, "s") == 0) return 1;
 if (strcmp(keyString, "d") == 0) return 2;
 if (strcmp(keyString, "f") == 0) return 3;
 if (strcmp(keyString, "h") == 0) return 4;
 if (strcmp(keyString, "g") == 0) return 5;
 if (strcmp(keyString, "z") == 0) return 6;
 if (strcmp(keyString, "x") == 0) return 7;
 if (strcmp(keyString, "c") == 0) return 8;
 if (strcmp(keyString, "v") == 0) return 9;
 // what is 10?
 if (strcmp(keyString, "b") == 0) return 11;
 if (strcmp(keyString, "q") == 0) return 12;
 if (strcmp(keyString, "w") == 0) return 13;
 if (strcmp(keyString, "e") == 0) return 14;
 if (strcmp(keyString, "r") == 0) return 15;
 if (strcmp(keyString, "y") == 0) return 16;
 if (strcmp(keyString, "t") == 0) return 17;
 if (strcmp(keyString, "1") == 0) return 18;
 if (strcmp(keyString, "2") == 0) return 19;
 if (strcmp(keyString, "3") == 0) return 20;
 if (strcmp(keyString, "4") == 0) return 21;
 if (strcmp(keyString, "6") == 0) return 22;
 if (strcmp(keyString, "5") == 0) return 23;
 if (strcmp(keyString, "=") == 0) return 24;
 if (strcmp(keyString, "9") == 0) return 25;
 if (strcmp(keyString, "7") == 0) return 26;
 if (strcmp(keyString, "-") == 0) return 27;
 if (strcmp(keyString, "8") == 0) return 28;
 if (strcmp(keyString, "0") == 0) return 29;
 if (strcmp(keyString, "]") == 0) return 30;
 if (strcmp(keyString, "o") == 0) return 31;
 if (strcmp(keyString, "u") == 0) return 32;
 if (strcmp(keyString, "[") == 0) return 33;
 if (strcmp(keyString, "i") == 0) return 34;
 if (strcmp(keyString, "p") == 0) return 35;
 if (strcmp(keyString, "RETURN") == 0) return 36;
 if (strcmp(keyString, "l") == 0) return 37;
 if (strcmp(keyString, "j") == 0) return 38;
 if (strcmp(keyString, "'") == 0) return 39;
 if (strcmp(keyString, "k") == 0) return 40;
 if (strcmp(keyString, ";") == 0) return 41;
 if (strcmp(keyString, "\\") == 0) return 42;
 if (strcmp(keyString, ",") == 0) return 43;
 if (strcmp(keyString, "/") == 0) return 44;
 if (strcmp(keyString, "n") == 0) return 45;
 if (strcmp(keyString, "m") == 0) return 46;
 if (strcmp(keyString, ".") == 0) return 47;

 fprintf(stderr, "keyString %s Not Found. Aborting...\n", keyString);
 exit(EXIT_FAILURE);
}

所以我的问题是,如何在keyCodeForKeyString(currentCharacter)的论证中得到CGPostKeyboardEvent

2 个答案:

答案 0 :(得分:3)

这个问题是一场噩梦,因为有些功能可以将密钥代码转换为字符代码,但不是相反。请记住,并非所有字符都可以输入,哪些字符可以输入取决于当前的键盘布局。

如果您的目标是在其他应用程序中显示某些文本,则可以使用CGEventKeyboardSetUnicodeString进行单个字符翻译。但是,此功能的实现一直不稳定,因此请务必测试您关注的所有操作系统版本,以及Carbon和Cocoa应用程序。

答案 1 :(得分:2)

这可能是一个难题,但不是因为@JWWalker所说的。

如果您可以轻松地将键码转换为字符,那么从字符转换为键码是微不足道的。它是两者之间的一对一映射(一个字符有一个键码,一个键码有一个[有时不可打印]字符),所以你可以自己轻松地构建转换。 ShortcutRecorder项目有一个NSValueTransformer subclass可以执行此操作。

难点在于发布击键并不总是会导致同步操作。由于您(基本上)与另一个流程进行通信,因此您不知道该流程将花多长时间处理您的事件帖子并执行相应的操作。 “发布”和“处理”之间的时间基于系统上的当前负载和活动是不确定的。 通常它发生得相当快(并且以大多数同步的方式出现),但并非如此。我的特殊例子来自处理粘贴板服务器,它有时需要非常好的时间来响应 cmd - v 按键。

如果您所做的只是模仿打字,那么这应该不会太糟糕。您可以使用char*(或类似)获取字符串的-[NSString UTF8String],然后只需遍历字符,将它们转换为密钥代码,然后发布相应的事件。