alpha49 2023-04-19 22:22 采纳率: 61.1%
浏览 38
已结题

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,那应该怎么做?求解答,谢谢。
  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-04-19 22:29
    关注

    该回答引用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函数被用来将键符号转换为键码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月19日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教