• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: virtual keycode to character
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: virtual keycode to character


  • Subject: Re: virtual keycode to character
  • From: "email@hidden" <email@hidden>
  • Date: Wed, 29 Apr 2009 16:40:04 -0700

ken,
thank you. this solved my problem.

and for the archives (to help anyone in the future), here is my code:

UInt32 deadKeyState = 0;
UniCharCount actualCount = 0;
UniChar baseChar;
TISInputSourceRef sourceRef = TISCopyCurrentKeyboardLayoutInputSource();
CFDataRef keyLayoutPtr = (CFDataRef)TISGetInputSourceProperty( sourceRef, kTISPropertyUnicodeKeyLayoutData);
CFRelease( sourceRef);
UCKeyTranslate( (UCKeyboardLayout*)CFDataGetBytePtr(keyLayoutPtr),
[theEvent keyCode],
kUCKeyActionDown,
0,
LMGetKbdLast(),
kUCKeyTranslateNoDeadKeysBit,
&deadKeyState,
1,
&actualCount,
&baseChar);


ken

p.s. i realize this might have a bug if the unicode for the unmodified keyboard character is more than 1 unicharacter.


At 9:53 PM -0500 4/27/09, Ken Thomases wrote:
On Apr 27, 2009, at 7:46 PM, email@hidden wrote:

in my app, i allow the user to specify keyboard shortcuts for menu items (in a manner similar to xcode). for the string passed to -[MenuItem setKeyEquivalent], i pass the string obtained from the current event via [NSEvent charactersIgnoringModifiers]. this works fine almost all the time. however, for some keyboard presses it doesn't work properly, namely for shift and some of the number keys, eg., command-! (command exclamation mark) doesn't work as a keyboard equivalent, but shift-command-1 (shift command one) does work. thus, i would like a reliable way to go from virtual keycode to the non-shifted character.

in searching the archives, this topic has come up several times, but all proposed solutions that i've found make use of one or more deprecated (in leopard) api calls. eg., LMGetKBDType or GetScriptManagerVariable, etc.

does anyone have a solution that doesn't rely on any deprecated api calls?

You can use TISCopyCurrentKeyboardLayoutInputSource to get the current keyboard input source. Then, you can query it using TISGetInputSourceProperty with kTISPropertyUnicodeKeyLayoutData to get the 'uchr' data for that keyboard layout. With that, you can call UCKeyTranslate.


By the way, LMGetKbdType is not deprecated, at least according to its declaration in the headers. It is documented on a page which is, as a whole, marked as a legacy document. However, I don't know of a way to obtain the keyboard type otherwise (except in the context of a Carbon event).

Cheers,
Ken
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: virtual keycode to character
      • From: Ken Thomases <email@hidden>
References: 
 >virtual keycode to character (From: "email@hidden" <email@hidden>)
 >Re: virtual keycode to character (From: Ken Thomases <email@hidden>)

  • Prev by Date: Re: File Reading Problems
  • Next by Date: Re: virtual keycode to character
  • Previous by thread: Re: virtual keycode to character
  • Next by thread: Re: virtual keycode to character
  • Index(es):
    • Date
    • Thread