Objective c 如何将字符串转换为一系列击键?
我正在使用Objective c 如何将字符串转换为一系列击键?,objective-c,cocoa,keyboard,Objective C,Cocoa,Keyboard,我正在使用CGPostKeyboardEvent((CGCharCode)0,(CGKeyCode)55,true)
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);
}
int-stringLength=[数据长度];
对于(int i=1;i来说,这个问题是一个噩梦,因为有一些函数可以将键代码转换为字符代码,但不是相反。请记住,并非所有字符都可以键入,并且可以键入哪些字符取决于当前的键盘布局
如果您的目标是让某些文本出现在另一个应用程序中,您可以使用CGEventKeyboardSetUnicodeString
,而无需翻译单个字符。但是,此功能的实现一直不稳定,因此请确保在您关心的所有操作系统版本上以及在Carbon和Cocoa应用程序中进行测试。这个问题是一个噩梦,因为有一些函数可以将关键代码转换为字符代码,但反过来就不行了。请记住,并非所有字符都可以键入,而哪些字符可以键入取决于当前的键盘布局
如果您的目标是使某些文本出现在另一个应用程序中,则可以使用CGEventKeyboardSetUnicodeString
,而无需翻译单个字符。但是,此功能的实现一直不稳定,因此请确保在您关心的所有操作系统版本上以及在Carbon和Cocoa应用程序中进行测试。答案可能是个难题,但不是因为@JWWalker所说的原因
如果您可以轻松地将键码转换为字符,那么从字符转换为键码就很简单了。这是两者之间的1对1映射(一个字符有一个键码,而一个键码有一个[有时不可打印]字符),因此您可以轻松地自己构建转换。项目有一个实现这一点的映射
困难在于,发布击键并不总是导致同步操作。由于您(本质上)正在与另一个进程通信,您不知道该进程处理事件发布和执行适当操作需要多长时间。从“发布”到“处理”之间的时间根据系统上的当前负载和活动,它是不确定的。通常它发生得相当快(并且以一种看起来几乎同步的方式),但它不一定是。我的特定示例来自于处理粘贴板服务器,它有时需要非常长的时间来响应cmd-v击键
如果您所做的只是模拟键入,那么这应该不会太糟糕。您可以使用-[NSString UTF8String]
获得字符串的字符*
(或类似),然后简单地循环遍历字符,将其转换为键码,并发布相应的事件。这可能是一个困难的问题,但不是因为@JWWalker声明的原因
如果您可以轻松地将键码转换为字符,那么从字符转换为键码就很简单了。这是两者之间的1对1映射(一个字符有一个键码,而一个键码有一个[有时不可打印]字符),因此您可以轻松地自己构建转换。项目有一个实现这一点的映射
困难在于,发布击键并不总是导致同步操作。由于您(本质上)正在与另一个进程通信,您不知道该进程处理事件发布和执行适当操作需要多长时间。从“发布”到“处理”之间的时间根据系统上的当前负载和活动,它是不确定的。通常它发生得相当快(并且以一种看起来几乎同步的方式),但它不一定是。我的特定示例来自于处理粘贴板服务器,它有时需要非常长的时间来响应cmd-v击键
如果您所做的只是模拟键入,那么这应该不会太糟糕。您可以使用-[NSString UTF8String]
获得字符串的字符*
(或类似),然后简单地循环遍历字符,将它们转换为键码,并发布相应的事件。我看到CGEventKeyboardSetUnicodeString
的参数是(CGEventRef事件,UniCharCount stringLength,const UniChar unicodeString[])
1.CGEventRef
参数使用什么事件?2.NSString.length
是否与UniCharCount
参数兼容,以及NSString
是否与const UniChar
参数兼容?谢谢您的帮助。1.使用CGEventCreateKeyboardEvent
。2.是和否。使用-[NSString getCharacters:范围:]
将字符提取到缓冲区中。那么如何传递实际字符串?或者更好的是,请您确切地告诉我如何进行此操作?我不太确定如何将CGEventCreateKeyboardEvent作为参数传递,因为它需要特定的键代码。非常感谢您的帮助。我认为在此过程中传递哪个键代码并不重要例,我想我已经使用了0。我看到CGEventKeyboardSetUnicodeString
的参数是(CGEventRef事件,UniCharCount stringLength,const UniChar unicodeString[])
1.CGEventRef
参数使用什么事件?2.NSString.length
是否与UniCharCount
参数兼容,以及NSString
是否与const UniChar
参数兼容?谢谢您的帮助。1.使用CGEventCreateKeyboardEvent
。2.是和否。使用-[NSString getCharacters:range::
将