如何使用C/ c++获得num锁状态
How to get a num lock state using C/C++?
我读过Gdk论坛链接,上面说从3.0版开始实现num锁定状态api。但我使用的是2.4版本,我不能更新到3.0版本,因为我需要支持较低的Linux版本。这是讨论链接:
http://mail.gnome.org/archives/commits-list/2010-July/msg00259.html所以,有没有其他的方法来获得num锁状态使用内部Linux命令?
问候,iSight
获取NumLock状态的示例代码。设foo.c
为
#include <stdio.h>
#include <X11/Xlib.h>
int main(void) {
Display *dpy = XOpenDisplay(":0");
XKeyboardState x;
XGetKeyboardControl(dpy, &x);
XCloseDisplay(dpy);
printf("led_mask=%lxn", x.led_mask);
printf("NumLock is %sn", (x.led_mask & 2) ? "On" : "Off");
return 0;
}
在戴尔笔记本电脑上使用CentOS 5进行测试后:
gcc foo.c -o foo -lX11
foo
led_mask=2
NumLock is On
或者你可以用popen("xset q | grep LED");
做点什么。
掩码的第二位对于NumLock来说是相当常见的,但我不相信它是有保证的。
原始答案:一个好的起点是xev
,可使用约20年:
xev
您可以通过:
解码关键事件foobar (XKeyEvent *bar) {
char dummy[20];
KeySym key;
KeySym keyKeypad;
XLookupString(bar, dummy, sizeof dummy, &key, 0);
keyKeypad = XKeycodeToKeysym(..., bar->keycode, NUMLOCK_Mask);
if (IsKeypadKey(keyKeypad))
...;
// ...
}
如果你不关心Numlock状态"而什么都没有发生",只有当例如按键发生时,最低开销的方式是:
对于某些XKeyEvent *xke
bool numlock = ((xke->state & Mod2Mask) == Mod2Mask);
对于GDK,您可能需要类似GDK的东西。FilterFunc获取xevent
。检查xevent->type
.
#include <Xlib.h>
XEvent = (XEvent *) &xevent // from Gdk.FilterFunc
int type = event ->type;
switch(type) {
case KeyPress:
case KeyRelease:
do_something_with((XKeyEvent *) event);
break;
}
我做了一些嗅探,我发现了ioctl.h
的一个可能的实现,它轮询键盘状态并针对几个标志进行测试。
看看这个表单帖子的实现,用K_NUMLOCK
*代替K_CAPSLOCK
。这是相当丑陋的,但它可以很容易地包装在一个函数和隐藏。
*替换的原因是由于一个旧的错误,其中大写锁定和num锁定意外颠倒。
我已经检查了硬件按键代码。每当num锁上并按下num键时,我比较硬件键代码,这是所有制造商普遍不变的。因此,我不需要使用ioctl.h header。
您可以使用以下linux命令来执行
{if (num_lock == 0) system("setleds -F +num");如果num_lock == 1);//什么都不做}
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何在Windows C MFC应用程序状态栏中禁用CAP NUM SCRL指示器
- 如何使用C/ c++获得num锁状态