如何在C

时间:2015-05-04 12:10:07

标签: c linux cygwin

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

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

  • 按键
  • 按键

  • 鼠标按钮
  • 鼠标按钮

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

有可能吗?

到目前为止,我找到了一个使用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&并且鼠标指针必须位于X服务器窗口内。所以这不是一个好的解决方案。

另一种方法是使用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定义的。

1 个答案:

答案 0 :(得分:1)

您似乎想要制作跨平台计划。我怀疑你是否能用Linux专用库来解决这个问题。我的建议是:

  1. Ditch X支持Qt或GTK。
  2. 使用来自Windows.h的工具创建一个侦听关键事件的模块,仅在用户在Windows上时编译。随着项目的发展,你迟早要为其他东西做这件事。