3

我在这里搜索过,没有发现任何真正涵盖这个的问题。

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

我们希望这样做以允许应用程序在不读取其首选项文件的情况下启动,以防万一被损坏(例如,我们在测试首选项错误时看到,现在已修复,该错误使窗口大小为 0 x 0) .

我们正在使用名为 Juce 的优秀且全面的跨平台 C++ 库。不幸的是,Juce 的大师告诉我,他认为这至少在 OS/X 上是不可能的,因为您只能获得键盘事件,并且除非发生变化,否则无法读取键的状态

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

或者...提高一个级别...除了“在启动程序时按住一个键”之外,是否有另一种解决方案来提供“运行程序但不读取 prefs 文件”的功能?这是消费者软件,所以我们不能对用户期望太多。

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

谢谢,一切安好!我会报告我的进展。

4

2 回答 2

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!");

}
于 2011-11-11T20:01:45.177 回答
2

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

UInt32 flags = GetCurrentKeyModifiers();
if ( (flags & optionKey) != 0)
{...}
于 2011-11-11T20:54:28.937 回答