C语言getch函数怎么获取Ctrl等特殊按键?

我写了如下代码:
#include "pthread.h"
#include "conio.h"

int key = 0;

void get(){
    while(1){
        if(kbhit()){
            key = getch();
        }
    }
}

int* getkb(){
    pthread_t getkey;
    pthread_create(&getkey, NULL, (void*)get, NULL);
    pthread_detach(getkey);
    return &key;
}

目的是新建一个线程然后不断获取键盘按键的键值。但是我发现键盘上一些键,比如Ctrl键或Shift键等键,按后并不会返回键值。如果我想获取一个组合按键,比如Ctrl+c,那应该怎么做?求解答,谢谢。

该回答引用ChatGPT-3.5

C语言中的getch函数只能获取标准ASCII字符集中的按键,无法获取组合键,比如Ctrl+c。要获取组合键,你需要使用操作系统提供的底层API。


在Windows操作系统中,可以使用GetAsyncKeyState函数来获取组合键。该函数可以检查特定键的状态(按下或释放),并返回该键的状态以及其他键的状态。下面是一个示例代码,演示如何获取Ctrl+c键组合键的状态:

#include <windows.h>
#include <stdio.h>

int main() {
    while (1) {
        if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState('C') & 0x8000) {
            printf("Ctrl+c pressed\n");
        }
    }
    return 0;
}

在这个代码中,GetAsyncKeyState函数被用来检查Ctrl和C键的状态,&运算符被用来检查某个键是否被按下,0x8000是用来判断键的高位是否为1的掩码。


在Linux操作系统中,可以使用X11库来获取组合键。下面是一个示例代码,演示如何获取Ctrl+c键组合键的状态:

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

int main() {
    Display* dpy = XOpenDisplay(NULL);
    while (1) {
        XEvent e;
        XNextEvent(dpy, &e);
        if (e.type == KeyPress && e.xkey.state & ControlMask && e.xkey.keycode == XKeysymToKeycode(dpy, 'C')) {
            printf("Ctrl+c pressed\n");
        }
    }
    XCloseDisplay(dpy);
    return 0;
}

在这个代码中,X11库被用来获取X Window系统事件,KeyPress事件表示某个键被按下,state成员表示当前按下的修饰键,keycode成员表示按下的键的键码,XKeysymToKeycode函数被用来将键符号转换为键码。

#include <stdio.h>
#include <conio.h> // 在Windows环境下使用

int main()
{
    int ch1, ch2;
    printf("Input Ctrl+C or Ctrl+Z:\n");

    ch1 = getch(); // 获取第一个字符
    if (ch1 == 3) // 如果是Ctrl+C,则输出并退出程序
    {
        printf("^C\n");
        return 0;
    }

    ch2 = getch(); // 获取第二个字符
    if (ch1 == 224 && ch2 == 26) // 如果是Ctrl+Z,则输出
    {
        printf("^Z\n");
    }
    else // 如果不是特殊按键,则输出
    {
        putch(ch1);
        putch(ch2);
    }

    return 0;
}