Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何将字符串转换为一系列击键?_Objective C_Cocoa_Keyboard - Fatal编程技术网

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

Objective c 如何将字符串转换为一系列击键?,objective-c,cocoa,keyboard,Objective C,Cocoa,Keyboard,我正在使用CGPostKeyboardEvent((CGCharCode)0,(CGKeyCode)55,true)

我正在使用
CGPostKeyboardEvent((CGCharCode)0,(CGKeyCode)55,true)
编辑:好的,我想我找到了解决方案,但我无法正确使用语法。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::