【发布时间】:2012-07-06 12:11:58
【问题描述】:
我正在为 Mac 制作一个简单的钢琴游戏。而当用户按下键盘时,钢琴的琴键
可以同时按下。
但是,我对如何检查何时在 Mac 键盘上按下“D,F .....”键一无所知。
目标-C
【问题讨论】:
-
这似乎根本不像那个问题的重复。 Skye 似乎在询问检测按键,而不是生成它们。
标签: objective-c macos cocoa keyboard
我正在为 Mac 制作一个简单的钢琴游戏。而当用户按下键盘时,钢琴的琴键
可以同时按下。
但是,我对如何检查何时在 Mac 键盘上按下“D,F .....”键一无所知。
目标-C
【问题讨论】:
标签: objective-c macos cocoa keyboard
与许多事情一样,有多种方法可以做到这一点。然而,一个简单的方法是在您的 NSView 子类中覆盖 -keyDown:。据推测,这将是绘制钢琴键盘的 NSView 子类。示例:
- (void)keyDown:(NSEvent *)event
{
switch ([event keyCode])
{
case 0x02:
// D key pressed
break;
case 0x03:
// F key pressed
break;
// etc.
}
}
我发现Key Codes 应用程序可以方便地查找关键代码,但您也可以在您的-keyDown: 方法中添加一个日志语句,然后按下键来查找相应的代码。它们也在<HIToolbox/Events.h> 标头中。
更多信息请参见Apple's Event Handling Guide。
【讨论】:
-keyDown:。为了实际接收关键事件,视图必须是第一响应者。您可以通过在包含视图的窗口上调用[window makeFirstResponder:pianoView] 使视图成为第一响应者。我在我的答案中添加了指向相关文档的链接。你应该读一下。
你有一个 NSView 子类作为钢琴视图吗?如果你这样做了,那么只需覆盖-(void)keyDown:(NSEvent *)event 方法,并记录下你想要的任何键。例如:
-(void)keyDown:(NSEvent *)event {
NSString *characters;
characters = [event characters];
switch (characters)
{
case 'd':
//do something;
default:
break;
}
}
【讨论】:
通过使用此代码,您可以捕获所有按键事件。
i 是 KeyCode 。样本 kVK_End
while (true)
{
for (int i=0; i<128; i++)
{
if (CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState,i))
{
NSLog(@"Key Press");
}
}
}
【讨论】: