4

基本上,我想编写一个应用程序来在按下 Num Lock 键时进行捕获。这需要跨 windows、linux、mac 支持。

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

应用程序是否应该用 Qt C++ 编写,如果是,Qt 库是否有跨平台调用 interceptNumLock()?

它可能在Java上完成吗?

通过跨浏览器插件?

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

4

4 回答 4

1

您将不得不使用一些本机代码来拦截操作系统通常不分派给您的应用程序的任何击键。

在 Java 中,您可以使用一些JNA来完成此操作。

这个问题有一个例子。

于 2012-10-14T02:30:26.580 回答
1

你可以用Java来做。Windows、Linux 和 MacOS 都支持 Java。这是一个单行:

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

用二进制代码做同样的事情需要你(A)假设它是一台 x86 机器,并且(B)检测操作系统,这会很复杂。但是,如果您这样做了,那么您可以进行特定于操作系统的调用,以根据它是哪个操作系统来获取大写锁定状态。

您可以使用如下代码对 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 状态而无需通过操作系统,这就是任何此类代码都依赖于操作系统的原因。

于 2012-10-16T15:35:00.423 回答
0

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

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

于 2012-10-09T19:38:16.707 回答
0

Qt 4.7.4:有没有办法找出 CAPS LOCK 的状态?

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

于 2012-10-16T13:03:20.317 回答