cocoa – 如何在没有NSTextView的情况下从关键事件中捕获Unicode

cocoa – 如何在没有NSTextView的情况下从关键事件中捕获Unicode,第1张

概述我想从应用程序的任何窗口捕获关键事件,并将它们解释为Unicode.例如,如果用户键入Option-e-e(在默认配置的美国英语键盘上),我想将其识别为“é”. 我尝试捕获按键事件并调用 – [NSEvent characters].但是,正如文档中所述,“此方法为死键返回一个空字符串,例如Option-e.”如果我输入Option-e-e,那么它对于Option-e没有任何意义,对于第二个e则没 我想从应用程序的任何窗口捕获关键事件,并将它们解释为Unicode.例如,如果用户键入Option-e-e(在默认配置的美国英语键盘上),我想将其识别为“é”.

我尝试捕获按键事件并调用 – [NSEvent characters].但是,正如文档中所述,“此方法为死键返回一个空字符串,例如Option-e.”如果我输入Option-e-e,那么它对于Option-e没有任何意义,对于第二个e则没有“e”.

有没有办法将一系列密钥代码(来自 – [NSEvent keyCode])组合成Unicode字符?

或者为每个键入的Unicode字符(如Java’s key-typed event)接收事件的方法?

@H_301_16@解决方法 这是一种获取一系列按键事件并获取他们键入的Unicode字符的方法.

基本上,每收到一次按键事件,请拨打UCKeyTranslate().使用其deadKeyState参数捕获死键并将其传递给后续调用.

例:

>接收Option-e的按键事件.
>使用虚拟键码(对于e),修饰键状态(对于Option)和用于存储死键状态的变量调用UCKeyTranslate().

> UCKeyTranslate()输出一个空字符串并更新死键状态.

>接收e的关键新闻事件.
>使用虚拟键代码(对于e)和保持死键状态的变量调用UCKeyTranlate().

> UCKeyTranslate()输出“é”.

示例代码(为每个按键事件调用的函数):

/** * Returns the Unicode characters that would be typed by a key press. * * @param event A key press event. * @param deadKeyState To capture multi-keystroke characters (e.g. Option-E-E for "é"),pass a reference to the same *      variable on consecutive calls to this function. Before the first call,you should initialize the variable to 0. * @return One or more Unicode characters. */CFStringRef getCharactersForKeyPress(NSEvent *event,UInt32 *deadKeyState){    // https://stackoverflow.com/questions/12547007/convert-key-code-into-key-equivalent-string    // https://stackoverflow.com/questions/8263618/convert-virtual-key-code-to-unicode-string    TISinputSourceRef currentKeyboard = TIScopyCurrentKeyboardinputSource();    CFDataRef layoutData = TISGetinputSourceProperty(currentKeyboard,kTISPropertyUnicodeKeyLayoutData);    const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);    CGEventFlags flags = [event modifIErFlags];    UInt32 modifIErKeyState = (flags >> 16) & 0xFF;    const size_t unicodeStringLength = 4;    UniChar unicodeString[unicodeStringLength];    UniCharCount realLength;    UCKeyTranslate(keyboardLayout,[event keyCode],kUCKeyActionDown,modifIErKeyState,LMGetKbdType(),deadKeyState,unicodeStringLength,&realLength,unicodeString);    CFRelease(currentKeyboard);    return CFStringCreateWithCharacters(kcfAllocatorDefault,unicodeString,realLength);}
总结

以上是内存溢出为你收集整理的cocoa – 如何在没有NSTextView的情况下从关键事件中捕获Unicode全部内容,希望文章能够帮你解决cocoa – 如何在没有NSTextView的情况下从关键事件中捕获Unicode所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存