mac 虚拟键盘 java,Mac OS 虚拟键盘的一些问题。(CGKeyCode)

最近有一个需求,做一个虚拟键盘,用户点击虚拟键盘来代替键盘输入,一想挺简单的,大概一个实现思路就是模拟键盘来发送CGKeyCode 大致思路就是

#include #include CGEventRef key = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)code, true);

CGEventPost(kCGHIDEventTap, key);

CFRelease(key);

做完后发现虽然是实现了需求,但是却会弹出一个权限提示 这样需要用给给应用辅助功能的权限。万一用户不给到这个权限,这虚拟键盘就不能用了,这个思路就行不通了。

后来的一种方法。实现NSTextFieldDelegate在此回调中监听当前NSTextField的光标位置来向其stringValue插入字符实现虚拟键盘

- (nullable NSArray *)textField:(NSTextField *)textField textView:(NSTextView *)textView candidatesForSelectedRange:(NSRange)selectedRange NS_AVAILABLE_MAC(10_12_2);

//获取当前光标的位置

selectedRange.location

然后发现有2点问题。1.在鼠标没有点击NSTextField的时候,插入字符NSTextField是全选状态不美观。2.NSTextField失去第一响应者的时候无法正确获取到光标位置。

思索一会儿后决定人为的来控制光标

NSInteger index;//当前光标的位置

NSTextField *textField;//当前输入框

//当textField第一次插入字符的时候 将textField的光标设置到后边去,避免了输入框全选的情况

NSRange rr = NSMakeRange(1, 0);

textField.currentEditor.selectedRange = rr;

index = textField.currentEditor.selectedRange.location;

//以后的每次输入都要将光标移动当前字符的后边

NSRange rr = NSMakeRange(index+1, 0);

textField.currentEditor.selectedRange = rr;

index = textField.currentEditor.selectedRange.location;

//删除的时候也要记得把光标位置挪到删除字符的前边

if (index == 0) {

textField.stringValue = [textField.stringValue substringWithRange:NSMakeRange(0, [textField.stringValue length] - 1)];

index = 0;

}else {

index = textField.currentEditor.selectedRange.location;

NSMutableString *confStr = [NSMutableString textField.stringValue];

[confStr deleteCharactersInRange:NSMakeRange(index-1, 1)];

textField.stringValue = confStr;

NSRange rr = NSMakeRange(index-1, 0);

textField.currentEditor.selectedRange = rr;

}

这样一来就大概的实现了虚拟键盘的输入。实测跟点击键盘一个效果~

附贴上CGKeyCode对照表:

/*

* Summary:

* Virtual keycodes

*

* Discussion:

* These constants are the virtual keycodes defined originally in

* Inside Mac Volume V, pg. V-191. They identify physical keys on a

* keyboard. Those constants with "ANSI" in the name are labeled

* according to the key position on an ANSI-standard US keyboard.

* For example, kVK_ANSI_A indicates the virtual keycode for the key

* with the letter 'A' in the US keyboard layout. Other keyboard

* layouts may have the 'A' key label on a different physical key;

* in this case, pressing 'A' will generate a different virtual

* keycode.

*/

enum {

kVK_ANSI_A = 0x00,

kVK_ANSI_S = 0x01,

kVK_ANSI_D = 0x02,

kVK_ANSI_F = 0x03,

kVK_ANSI_H = 0x04,

kVK_ANSI_G = 0x05,

kVK_ANSI_Z = 0x06,

kVK_ANSI_X = 0x07,

kVK_ANSI_C = 0x08,

kVK_ANSI_V = 0x09,

kVK_ANSI_B = 0x0B,

kVK_ANSI_Q = 0x0C,

kVK_ANSI_W = 0x0D,

kVK_ANSI_E = 0x0E,

kVK_ANSI_R = 0x0F,

kVK_ANSI_Y = 0x10,

kVK_ANSI_T = 0x11,

kVK_ANSI_1 = 0x12,

kVK_ANSI_2 = 0x13,

kVK_ANSI_3 = 0x14,

kVK_ANSI_4 = 0x15,

kVK_ANSI_6 = 0x16,

kVK_ANSI_5 = 0x17,

kVK_ANSI_Equal = 0x18,

kVK_ANSI_9 = 0x19,

kVK_ANSI_7 = 0x1A,

kVK_ANSI_Minus = 0x1B,

kVK_ANSI_8 = 0x1C,

kVK_ANSI_0 = 0x1D,

kVK_ANSI_RightBracket = 0x1E,

kVK_ANSI_O = 0x1F,

kVK_ANSI_U = 0x20,

kVK_ANSI_LeftBracket = 0x21,

kVK_ANSI_I = 0x22,

kVK_ANSI_P = 0x23,

kVK_ANSI_L = 0x25,

kVK_ANSI_J = 0x26,

kVK_ANSI_Quote = 0x27,

kVK_ANSI_K = 0x28,

kVK_ANSI_Semicolon = 0x29,

kVK_ANSI_Backslash = 0x2A,

kVK_ANSI_Comma = 0x2B,

kVK_ANSI_Slash = 0x2C,

kVK_ANSI_N = 0x2D,

kVK_ANSI_M = 0x2E,

kVK_ANSI_Period = 0x2F,

kVK_ANSI_Grave = 0x32,

kVK_ANSI_KeypadDecimal = 0x41,

kVK_ANSI_KeypadMultiply = 0x43,

kVK_ANSI_KeypadPlus = 0x45,

kVK_ANSI_KeypadClear = 0x47,

kVK_ANSI_KeypadDivide = 0x4B,

kVK_ANSI_KeypadEnter = 0x4C,

kVK_ANSI_KeypadMinus = 0x4E,

kVK_ANSI_KeypadEquals = 0x51,

kVK_ANSI_Keypad0 = 0x52,

kVK_ANSI_Keypad1 = 0x53,

kVK_ANSI_Keypad2 = 0x54,

kVK_ANSI_Keypad3 = 0x55,

kVK_ANSI_Keypad4 = 0x56,

kVK_ANSI_Keypad5 = 0x57,

kVK_ANSI_Keypad6 = 0x58,

kVK_ANSI_Keypad7 = 0x59,

kVK_ANSI_Keypad8 = 0x5B,

kVK_ANSI_Keypad9 = 0x5C

};

/* keycodes for keys that are independent of keyboard layout*/

enum {

kVK_Return = 0x24,

kVK_Tab = 0x30,

kVK_Space = 0x31,

kVK_Delete = 0x33,

kVK_Escape = 0x35,

kVK_Command = 0x37,

kVK_Shift = 0x38,

kVK_CapsLock = 0x39,

kVK_Option = 0x3A,

kVK_Control = 0x3B,

kVK_RightCommand = 0x36,

kVK_RightShift = 0x3C,

kVK_RightOption = 0x3D,

kVK_RightControl = 0x3E,

kVK_Function = 0x3F,

kVK_F17 = 0x40,

kVK_VolumeUp = 0x48,

kVK_VolumeDown = 0x49,

kVK_Mute = 0x4A,

kVK_F18 = 0x4F,

kVK_F19 = 0x50,

kVK_F20 = 0x5A,

kVK_F5 = 0x60,

kVK_F6 = 0x61,

kVK_F7 = 0x62,

kVK_F3 = 0x63,

kVK_F8 = 0x64,

kVK_F9 = 0x65,

kVK_F11 = 0x67,

kVK_F13 = 0x69,

kVK_F16 = 0x6A,

kVK_F14 = 0x6B,

kVK_F10 = 0x6D,

kVK_F12 = 0x6F,

kVK_F15 = 0x71,

kVK_Help = 0x72,

kVK_Home = 0x73,

kVK_PageUp = 0x74,

kVK_ForwardDelete = 0x75,

kVK_F4 = 0x76,

kVK_End = 0x77,

kVK_F2 = 0x78,

kVK_PageDown = 0x79,

kVK_F1 = 0x7A,

kVK_LeftArrow = 0x7B,

kVK_RightArrow = 0x7C,

kVK_DownArrow = 0x7D,

kVK_UpArrow = 0x7E

};

/* ISO keyboards only*/

enum {

kVK_ISO_Section = 0x0A

};

/* JIS keyboards only*/

enum {

kVK_JIS_Yen = 0x5D,

kVK_JIS_Underscore = 0x5E,

kVK_JIS_KeypadComma = 0x5F,

kVK_JIS_Eisu = 0x66,

kVK_JIS_Kana = 0x68

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值