小编tjb*_*300的帖子

在Windows上检测Java中的SHIFT键的问题

我正在用Java编写旧机器的模拟,我希望我的键盘处理能够SHIFT独立地处理左键和右键.

我有一个标准的AWT KeyListener注册并处理KeyPressed()KeyReleased()方法.这是问题所在:

1) Press Left-SHIFT  
  -> get KeyPressed() for VK_SHIFT with location=LEFT  ... good!
2) Keep Left-SHIFT held down, press Right-SHIFT too
  -> get KeyPressed() for VK_SHIFT with location=RIGHT ... good!
3) Release Right-SHIFT (left-SHIFT still held down)
  -> get ... absolutely nothing ... bad!
4) Release Left-SHIFT
  -> get KeyReleased() for VK_SHIFT with location=LEFT ... good.
Run Code Online (Sandbox Code Playgroud)

所以,我丢失了正确的KeyReleased()信息SHIFT.在Windows上运行时,这会以这种方式失败,但在Linux上正常工作(我看到所有事件).有任何想法吗?这只是我不得不忍受的Windows异常吗?奇怪的是,这两个Ctrl键并没有像这样失败- 我希望看到所有事件.

使用标准Sun KeyEventDemo.java程序很容易重现此行为.

java key-events awt keylistener

5
推荐指数
1
解决办法
234
查看次数

避免C预处理器中的双宏替换

这是一个简单的小C程序让我困惑了一段时间:

#include <stdio.h>
#define STR1(x) #x
#define STR(x) STR1(x)
int main(void) {
    printf("%s\n", STR(MYDEF));
}
Run Code Online (Sandbox Code Playgroud)

这只是使用标准的字符串化双定义技术将MYDEF #define的值打印为字符串.

编译(在Linux上)gcc -DMYDEF=abc prog.c运行结果,毫不奇怪,它打印出'abc'.

但是更改值gcc -DMYDEF=linux prog.c并且打印的结果不是'linux'而是'1'.

所以这让我感到困惑,但当然这是因为我发现gcc(在Linux上)有一个内置的#define,名为'linux',值为'1',STR(x)宏最终将MYDEF扩展到'linux'然后将linux扩展为'1'.

在我的真实程序中(这比上面的小测试复杂得多)我通过以不同(可能更好)的方式做事来绕过这个,但它让我很好奇...是否有一个简单的小宏技术可以避免这个双重替换并使程序打印出'linux'?我知道我可以添加Linux的-U或#undef,但这感觉有点笨拙.

我原以为所有内置的#defines都以下划线(通常是双下划线)开头,但我猜不是.

c linux macros gcc

5
推荐指数
1
解决办法
120
查看次数

标签 统计

awt ×1

c ×1

gcc ×1

java ×1

key-events ×1

keylistener ×1

linux ×1

macros ×1