gpt4 book ai didi

Cocoa 不会捕获 Shift 修饰符吗?

转载 作者:行者123 更新时间:2023-12-03 16:16:05 24 4
gpt4 key购买 nike

我有一个应用程序,我试图在其中捕获 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 {
...
}

我不确定是什么原因造成的,但我希望能够捕获 Shift 键按下的情况。预先感谢您对解决此问题的任何帮助。

编辑:如果有什么不同的话,我也使用 MacBook 键盘。

编辑:这绝对是一个以移位为中心的问题,因为将 (NSShiftKeyMask | NSAlphaShiftKeyMask) 更改为 NSControlKeyMask 确实具有预期的效果。

最佳答案

首先,-charactersIgnoringModifiers 不会忽略 Shift 键,因此您仍然会得到从它返回的移位字符(即大写和 !%#$%^&*)。您的函数中可能发生的情况是:您按shift-w,您的-isEqualTo:返回false,因为您正在比较小写“w”和大写“W”,因此您在进入移位检测代码之前返回底端。最简单的解决方案是仅检查两者。

但是,例如,如果您希望阿拉伯语键盘手能够轻松使用您的应用程序,那么您确实不应该对甚至可能不会出现在用户键盘上的字符进行硬编码。 -keyCode 返回的值是指键盘上按键的位置,而不是表示的字符。对于初学者来说,Eve​​nts.h 中以“kVK_ANSI_”和“kVK_”开头的常量(您可能必须链接到 Carbon.framework 和 #include 才能使用这些常量)可以与 -keyCode 进行比较返回,它们指的是使用 QWERTY 的美国人所期望的关键位置。因此,您可以(非常)确定,无论键盘布局如何,“wasd”的键码(kVK_ANSI_W、kVK_ANSI_A 等)将引用用户键盘左上角的三角形。

关于Cocoa 不会捕获 Shift 修饰符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/404830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com