我有一个应用程序,我正在尝试捕获shift键修改器来执行一个动作,但是当我运行程序并按下而没有Shift键修改器的普通键时,我会发出一声嘟嘟声并且修改器和键不会被发送到我的keyDown事件.相关代码是:
NSString* eventChars = [theEvent charactersIgnoringModifiers]; if ([eventChars isEqualTo:@"w"]) { newPlayerRow++; direction = eUp; } else if ([eventChars isEqualTo:@"x"]) { newPlayerRow--; direction = eDown; } else if ([eventChars isEqualTo:@"a"]) { newPlayerCol--; direction = eLeft; } else if ([eventChars isEqualTo:@"d"]) { newPlayerCol++; direction = eRight; } else { [super keyDown:theEvent]; return; } // handle the player firing a bullet if (([theEvent modifierFlags] & (NSShiftKeyMask | NSAlphaShiftKeyMask)) != 0) { NSLog(@"Shift key"); [self fireBulletAtColumn:newPlayerCol row:newPlayerRow inDirection:direction]; [self setNeedsDisplay:YES]; } else { ... }
我不确定是什么导致这种情况,但我希望能够捕获换档按键.在此先感谢您对此问题的任何帮助.
编辑:我也使用MacBook键盘,如果这有任何区别.
编辑:这绝对是一个以移位为中心的问题,因为改变(NSShiftKeyMask | NSAlphaShiftKeyMask)到NSControlKeyMask确实有所需的效果.
首先,-charactersIgnoringModifiers不会忽略shift键,因此您仍然会从中返回移位的字符(即UPPERCASE和!%#$%^&*).你的函数可能会发生什么:你按shift-w,你的-isEqualTo:返回false,因为你正在比较一个小写的'w'和一个大写的'W',所以你在得到移位检测代码之前返回底部.最简单的解决方案就是检查两者.
但是,如果你想要的,例如,阿拉伯语键盘手能够很容易地使用你的应用程序,你真的不应该硬编码甚至可能不会出现在用户的键盘上的字符.-keyCode返回的值是指键在键盘上的位置,而不是表示的字符.对于初学者来说,常量开始在"kVK_ANSI_"和Events.h"kVK_"(您可能需要链接到Carbon.framework和的#include <碳/ Carbon.h>使用这些常量)可以比作什么-keyCode返回,它们指的是QWERTY使用美国人期望的关键位置.所以,你可以(美丽的)肯定的是,无论键盘布局,为"WASD"(kVK_ANSI_W,kVK_ANSI_A等)的键码将指三角形在用户的键盘的左上方.