什么工具可以在所有桌面操作系统中拦截数字锁定键



基本上,我想编写一个应用程序,以便在按下Num Lock键时捕获。这需要在Windows,Linux,Mac上得到支持。

该应用程序可以以某种方式在浏览器中运行吗?使用HTML5等。

应用程序是否应该用Qt C++编写,如果是这样,Qt库是否有跨平台调用来拦截NumLock()?

它可能在Java上完成吗?

通过跨浏览器插件?

上述方法的优缺点是什么?如果是这样,我可以在考虑利弊后决定。

你可以在Java中做到这一点。Windows,Linux和MacOS都支持Java。这是一个单行:

boolean zCapsLockOn = java.awt.Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);

要在二进制代码中执行相同的操作,需要您 (A) 假设它是一台 x86 计算机,并且 (B) 检测操作系统,这将很复杂。但是,如果这样做,则可以进行特定于操作系统的调用,以根据操作系统获取capslock状态。

您可以使用如下代码与Qt进行此平台检查:

bool QMyClass::checkCapsLock()
{
    // platform dependent method of determining if CAPS LOCK is on
#ifdef Q_OS_WIN32 // MS Windows version
    return GetKeyState(VK_CAPITAL) == 1;
#else // X11 version (Linux/Unix/Mac OS X/etc...)
    Display * d = XOpenDisplay((char*)0);
    bool caps_state = false;
    if (d)
    {
        unsigned n;
        XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
        caps_state = (n & 0x01) == 1;
    }
    return caps_state;
#endif
}

请注意,如果不通过操作系统,您就无法编写二进制代码来直接从 BIOS 获取 CAPSLOCK 状态,这就是为什么任何此类代码都依赖于操作系统的原因。

您必须使用一些本机代码来拦截操作系统通常不调度到应用程序的任何击键。

在Java中,你可以使用一些JNA来完成这个任务。

这个问题有一个例子。

我会把它作为在浏览器上运行的普通网站应用程序来做,在这种情况下,更好的是使用 jQuery 库,它将为您提供浏览器和系统之间的跨浏览器兼容性:

请参阅我的jQuery大写锁定检测器的工作演示。您可以在Windows/Linux和不同的浏览器(Firefox,Chrome,IE)中尝试。

Qt 4.7.4: 有没有办法找出大写锁定的状态?

这是在 c/c++ 中执行此操作的方法。如果你在Qt中使用keyPressEvent,你应该能够检测到用户何时按下一个键,你可以检查按钮的状态。

最新更新