检测在OS / X(或Windows)启动期间按下的修改键?

时间:2011-11-11 17:47:37

标签: c++ windows macos juce

我在这里搜索过,没有找到真正涵盖此问题的任何问题。

我有一个跨平台的Windows-OS / X应用程序,我希望能够在应用程序启动时检测是否按下了shift或control这样的修改键。

我们想这样做是为了允许应用程序在不读取其首选项文件的情况下启动,以防某些方式被破坏(我们在测试prefs错误时看到,现在修复了,使得窗口大小为0,例如)。

我们正在使用名为Juce的优秀且全面的跨平台C ++库。不幸的是,Juce的主人告诉我,他认为这在OS / X上是不可能的,至少因为你只得到键盘事件并且没有办法读取键的状态除非有什么变化。

这是真的吗?或者有什么方法可以解决这个问题?我几乎可以肯定我使用过使用这种机制的Mac程序来绕过他们的偏好。

或者......升级一级...是否有另一种解决方案来提供“运行程序但不读取prefs文件”的功能,而不是“在启动程序时按住键”?这是消费者软件,因此我们不能期望用户过多。

最终解决方案将最终成为跨平台解决方案,因此Windows方面的提示也将受到赞赏。

谢谢,并且好!我将在最后报告进展情况。

2 个答案:

答案 0 :(得分:4)

适用于Mac(Objective-C):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    NSUInteger theFlags = [NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;

    if(theFlags & NSShiftKeyMask)     NSLog(@"Shift down!");
    if(theFlags & NSControlKeyMask)   NSLog(@"Control down!");
    if(theFlags & NSCommandKeyMask)   NSLog(@"Command down!");
    if(theFlags & NSAlternateKeyMask) NSLog(@"Alternate down!");
    if(theFlags & NSFunctionKeyMask)  NSLog(@"Function down!");

}

答案 1 :(得分:2)

第一个答案很好,但如果由于某种原因你想避免使用Objective-C,你可以使用Carbon框架:

UInt32 flags = GetCurrentKeyModifiers();
if ( (flags & optionKey) != 0)
{...}