Events iOS 7硬件键盘事件
现在我们有了iOS 7,苹果显然已经删除了从Events iOS 7硬件键盘事件,events,keyboard,ios7,Events,Keyboard,Ios7,现在我们有了iOS 7,苹果显然已经删除了从-sendEvent:接收键盘通知的选项。对于那些想要编写捕获所有关键事件并将其发送到远程计算机(例如VNC客户端)的内容的人来说,这是一个巨大的痛苦UIKeyCommand不提供所需的功能。有许多错误报告提交给苹果,但他们不会听。错误报告苹果正在关闭所有报告,因为它是重复的rdar://14129420. 最好的解决方案是什么?我至少能够通过私有API方式恢复这些事件,但是keyup不会返回任何有用的信息,例如发布的密钥。也许这是可以从UIEvent
-sendEvent:
接收键盘通知的选项。对于那些想要编写捕获所有关键事件并将其发送到远程计算机(例如VNC客户端)的内容的人来说,这是一个巨大的痛苦UIKeyCommand
不提供所需的功能。有许多错误报告提交给苹果,但他们不会听。错误报告苹果正在关闭所有报告,因为它是重复的rdar://14129420.
最好的解决方案是什么?我至少能够通过私有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
要侦听事件,请在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");
}
}
我希望这段代码至少能对需要它的人有所帮助。您可以使用\u modifierFlags
确定何时按下命令键、选项键和控制键。我没怎么玩过它,但这似乎是一个获得赛事的好方法
您可以从中借用代码来进行改进。如果有其他人找到更好的方法,请发布他们
因为这是使用私有API,所以最好将所有内容包装在respondsToSelector
中。例如\u未修改的输入
我不确定苹果是否会接受实现此功能的应用程序,因此使用此功能的风险自负。在UIApplication上覆盖此方法并享受乐趣:)
-(void)handleKeyUIEvent:(UIEvent*)事件
{
尺寸=malloc尺寸((uu桥常数无效*)(事件));
NSLog(@“%s”输入…%ld,函数,s);
//unsigned char*ptr=(unsigned char*)(u桥void*)事件;
无符号长*ptr=(无符号长*)(u桥无效*)事件;
//
//#定义关闭键屏蔽12
//#定义关闭键扫描代码15
//#定义OFF_KEY_CHAR 17
//NSLog(@“类型:%lx关闭:%d”,*(ptr+2),2);
//NSLog(@“掩码:%lx关闭:%d”,*(ptr+关闭键掩码),关闭键掩码);
//NSLog(@“扫描:%lx关闭:%d”,*(ptr+关闭键扫描码),关闭键扫描码);
//NSLog(@“字符:%lx关闭:%d”,*(ptr+off_KEY_CHAR),off_KEY_CHAR);
NSLog(@“sizeof unsigned long:%lx”,sizeof(unsigned long));
对于(int i=0;i
我正在查找有关UIKeyCommands的信息,并在链接中找到了自己:我可以在应用程序或主屏幕中捕捉触摸事件吗?我无法完全理解您关于要在何处捕捉触摸事件的问题?如果您的意思是在应用程序上,那么UIView中有用于触摸事件的公共回调。但我认为你无法捕捉到主屏幕上的触摸事件,因为它不属于你的应用程序。谢谢你的回答。我的意思是捕捉越狱设备中的事件。handleKeyUIEvent根据苹果的说法,这是允许使用的,因为它是一种私人方法?
- (void)handleKeyUIEvent:(UIEvent *)event
{
size_t s = malloc_size((__bridge const void *)(event));
NSLog(@"%s enter... %ld", __func__, s);
// unsigned char *ptr = (unsigned char *)(__bridge void *)event;
unsigned long *ptr = (unsigned long *)(__bridge void *)event;
//
//#define OFF_KEY_MASK 12
//#define OFF_KEY_SCANCODE 15
//#define OFF_KEY_CHAR 17
// NSLog(@"type: %lx off: %d", *(ptr + 2), 2);
// NSLog(@"MASK: %lx off: %d", *(ptr + OFF_KEY_MASK), OFF_KEY_MASK);
// NSLog(@"SCAN: %lx off: %d", *(ptr + OFF_KEY_SCANCODE), OFF_KEY_SCANCODE);
// NSLog(@"CHAR: %lx off: %d", *(ptr + OFF_KEY_CHAR), OFF_KEY_CHAR);
NSLog(@"sizeof unsigned long: %lx", sizeof(unsigned long));
for (int i = 0; i < s / 4; ++i) {
// NSLog(@"... [%d] = %x", i, *(unsigned char *)(ptr + i));
NSLog(@"... [%d] = %lx", i, *(unsigned long *)(ptr + i));
}
#define OFF_DUMP 8
unsigned long *dump = (unsigned long *) *(ptr + OFF_DUMP);
s = malloc_size((const void *)*(ptr + OFF_DUMP));
NSLog(@"... *[%d] size: %ld", OFF_DUMP, malloc_size((const void *)*(ptr + OFF_DUMP)));
for (int i = 0; i < s / 4; ++i) {
NSLog(@"..... [%d] = %lx", i, *(unsigned long *)(dump + i));
}
struct objc_super super_data = { self, [UIApplication class] };
objc_msgSendSuper(&super_data, @selector(handleKeyUIEvent:), event);
// [super handleKeyUIEvent:event];
}