iOS 7硬件键盘事件

GRM*_*cko 5 keyboard events ios7

现在我们有iOS 7,Apple显然已经删除了接收键盘通知的选项-sendEvent:.对于想要编写捕获所有关键事件并将其发送到远程计算机(EG a VNC客户端)的人来说,这是一个巨大的痛苦.UIKeyCommand不提供所需的功能.有许多提交给苹果的错误报告,但他们不会听.错误报告apple正在关闭所有报告,因为副本是rdar:// 14129420.

什么是最好的解决方案?

GRM*_*cko 5

我至少能够以私有API的方式获取这些事件,但是keyup不会返回任何有用的信息,例如发布的密钥.也许这是可以拉出来的东西UIEvent

需要添加的代码是以下定义UIPhysicalKeyboardEvent.

@interface PhysicalKeyboardEvent : UIEvent {//UIPhysicalButtonsEvent
    int _inputFlags;
    NSString *_modifiedInput;
    NSString *_unmodifiedInput;
    NSString *_shiftModifiedInput;
    NSString *_commandModifiedInput;
    NSString *_markedInput;
    long long _modifierFlags;
    NSString *_privateInput;
}
+ (id)_eventWithInput:(id)arg1 inputFlags:(int)arg2;
@property(retain, nonatomic) NSString *_privateInput; // @synthesize _privateInput;
@property(nonatomic) int _inputFlags; // @synthesize _inputFlags;
@property(nonatomic) long long _modifierFlags; // @synthesize _modifierFlags;
@property(retain, nonatomic) NSString *_markedInput; // @synthesize _markedInput;
@property(retain, nonatomic) NSString *_commandModifiedInput; // @synthesize _commandModifiedInput;
@property(retain, nonatomic) NSString *_shiftModifiedInput; // @synthesize _shiftModifiedInput;
@property(retain, nonatomic) NSString *_unmodifiedInput; // @synthesize _unmodifiedInput;
@property(retain, nonatomic) NSString *_modifiedInput; // @synthesize _modifiedInput;
@property(readonly, nonatomic) long long _gsModifierFlags;
- (void)_privatizeInput;
- (void)dealloc;
- (id)_cloneEvent;
- (_Bool)isEqual:(id)arg1;
- (_Bool)_matchesKeyCommand:(id)arg1;
//- (void)_setHIDEvent:(struct __IOHIDEvent *)arg1 keyboard:(struct __GSKeyboard *)arg2;
@property(readonly, nonatomic) long long _keyCode;
@property(readonly, nonatomic) _Bool _isKeyDown;
- (long long)type;
@end
Run Code Online (Sandbox Code Playgroud)

要收听事件,请在a中使用以下内容UIResponder.我不确定响应者是否需要密钥.

- (id)_keyCommandForEvent:(PhysicalKeyboardEvent *)event {
    //Some reason it gets called twice and it's not because of keyup. Keyup seems to not mention it's original key.
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(processEvent:) withObject:event afterDelay:0];
    return [super _keyCommandForEvent:event];
}
- (void)processEvent:(PhysicalKeyboardEvent *)event {
    NSLog(@"%@", [event _unmodifiedInput]);
    NSLog(@"%d", [event _isKeyDown]);
    NSLog(@"%d", [event _inputFlags]);
    if ([event _isKeyDown] && [[event _unmodifiedInput] isEqualToString:@"s"] && [event _modifierFlags]==206158430208) {
        NSLog(@"Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这段代码至少对那些需要它的人有所帮助.您可以确定何时使用命令键,选项键和控制键_modifierFlags.我没有玩过很多东西,但似乎是获得这些活动的好方法.

您可以从http://nacho4d-nacho4d.blogspot.com/2012/01/catching-keyboard-events-in-ios.html借用代码来改进.如果有其他人找到更好的方法,请发布它们!

由于这是使用私有API,因此最好将所有内容包装起来respondsToSelector.事情如_unmodifiedInput.

我不确定苹果是否会接受实现此功能的应用程序,因此请自行承担风险.