【问题标题】:How to capture event "down" "up" for a keystroke or a mouse button in C如何在C中为击键或鼠标按钮捕获事件“向下”“向上”
【发布时间】:2015-05-04 12:10:06
【问题描述】:

我发现了许多使用X11linux/input.h 的示例,不幸的是我在Cygwin 上,而linux/input.h 不存在。

我想要一个可以用来检测事件的简单示例,例如:

  • 按下键
  • 按键

或者

  • 鼠标按下
  • 鼠标按钮向上

我想找到一个可以在 Cygwin/Linux 上运行的解决方案,也可以在 Windows/OSX 上运行。

有可能吗?

到目前为止,我找到了 1 个使用 X11 的解决方案:

#include <stdio.h>
#include <X11/Xlib.h>

char *key_name[] = {
    "first",
    "second (or middle)",
    "third",
    "fourth",  // :D
    "fivth"    // :|
};

int main(int argc, char **argv)
{
    Display *display;
    XEvent xevent;
    Window window;

    if( (display = XOpenDisplay(NULL)) == NULL )
        return -1;

    window = DefaultRootWindow(display);
    XAllowEvents(display, AsyncBoth, CurrentTime);

    XGrabPointer(display, 
                 window,
                 1, 
                 PointerMotionMask | ButtonPressMask | ButtonReleaseMask , 
                 GrabModeAsync,
                 GrabModeAsync, 
                 None,
                 None,
                 CurrentTime);

    while(1) {
        XNextEvent(display, &xevent);
        switch (xevent.type) {
            case ButtonPress:
                printf("Button pressed  : %s\n", key_name[xevent.xbutton.button - 1]);
                break;
            case ButtonRelease:
                printf("Button released : %s\n", key_name[xevent.xbutton.button - 1]);
                break;
        }
    }

    return 0;
}

构建
gcc foo.c -lX11

不幸的是 Xserver 必须启动 startxwin&amp; 并且鼠标指针必须在 X server 窗口内。所以这不是一个好的解决方案。

另一种方法是使用 ncurses,但似乎状态 key-downkey-up 是不可能的。

以下示例在 cygwin 上不起作用,因为 conio.h 不是 POSIX:

#include <stdio.h>
#include <conio.h>
char ch;
void main(){
    while(1){
        if(kbhit()){ //kbhit is 1 if a key has been pressed
            ch=getch();
            printf("pressed key was: %c", ch);
        }
    }
}

conio.h 是一个 C 头文件,主要由 MS-DOS 编译器用于提供 控制台输入/输出。[1]它不是 C 标准库的一部分或 ISO C,也不是 POSIX 定义的。

【问题讨论】:

  • 好问题,答案是肯定的。我尝试了很多使用fcntl.htermios.hconio.hlinux/input.h 的示例,但我仍然没有成功……也许这不是一件容易的事……
  • 您应该在问题中包含您尝试过的内容以及失败的地方,以便人们可以帮助您解决这个问题,而不是简单地要求您提供打包的解决方案来满足您的需求。 Stack Overflow 不是让人们为你编写代码:)
  • 好吧,这篇文章会很长:)
  • 你能告诉我们你是如何编译程序的吗?

标签: c linux cygwin


【解决方案1】:

您似乎想制作一个跨平台程序。我怀疑您是否能够使用仅限 Linux 的库来解决此问题。我的建议是:

  1. 放弃 X 以支持 Qt 或 GTK。
  2. 使用来自Windows.h 的工具制作一个监听关键事件的模块,仅当用户在 Windows 上时才编译。随着项目的发展,您迟早需要为其他事情这样做。

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多