首页 > 其他分享 >C语言在控制台上实现鼠标操作的方法

C语言在控制台上实现鼠标操作的方法

时间:2022-11-24 11:44:06浏览次数:47  
标签:窗口 鼠标 int 句柄 C语言 windows 坐标 台上

 

文章目录


在制作面向用户系统时,我们往往需要设置除输入参数外更为灵活的操作方式,例如鼠标点击、按键按下(无阻塞输入)等;同时,我们需要制作更为精美的 UI而不是简陋的黑白界面。然而,纯C语言本身并不提供这些函数,为实现这些操作,我们需要调用 windows.h库中的函数(当然大前提是用户使用 windows系统)。

 

为实现鼠标操作,我们所涉及到的有关函数有:

了解windows库函数

  1. GetCursorPos(POINT* point); 获得鼠标在桌面中的坐标(左上角为原点),其中POINT是一个结构体类,包含x和y两个成员以表示横坐标和纵坐标。
  2. GetWindowRect(HWND hwnd,LPRECT* lprect);获得指定窗口的坐标信息(包括顶部和底部的横坐标,左端和右端的纵坐标),其中HWND是一个句柄类(句柄概念在后文中再说明),LPRECT是一个结构体类,包含top,bottom,left,right分别表示顶部、底部、左端、右端的坐标。
  3. GetAsyncKeyState(int vKey);判断指定按键是否按下,vKey为按键对应的ASCII值,如图所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);返回指定窗口的句柄,lpClassName指向一个用于指定类名的字符串,若为NULL则查找所有窗口;lpWindowName指定一个用于查找窗口名。

接下来还有一些windows.h库中的特殊函数:

  1. SetConsoleTitle(LPCSTR lpcstr);为程序设定标题。
  2. Sleep(int int);休眠,即暂停程序int秒后继续运行。

了解句柄

接下来说明句柄的概念:句柄是一种特殊指针(另一种说法为一种整型),用于标识应用程序中的对象(如窗口,按钮,图标等)。当前系统中每一个进程,每一个控件,都根据其虚拟内存地址拥有其对应的唯一句柄。于是,我们可以通过一个句柄找到对应的对象来指定操作。

知道以上函数后,我们就可以正式编写程序了。

实现思路与代码

思路:通过一个循环反复检测鼠标是否按下,如果按下,则检测当前鼠标光标在控制台中所对应的坐标,通过对控制台中UI的坐标进行对应来判断操作。值得一提的是,windows.h库中没有直接返回鼠标光标在控制台窗口中坐标的函数,于是我们通过得到鼠标光标在桌面中的坐标和控制台窗口在桌面中的坐标,来计算鼠标光标与控制台窗口的相对位置。

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

void MouseOpreate(int *x,int *y);
int main(){
    ...
	SetConsoleTitle("憨憨");//设定窗口标题
    ...
    int x,y;
    MouseOpreate(&x,&y);
    if((0<=x && x<=100)&&(0<=y && y<=20)){//通过UI在程序中对应的坐标指定操作
        ...
    }else if(...){
        ...
    }
}
void MouseOpreate(int *x,int *y){
    POINT *ptrpos;//声明POINT结构体类存储鼠标坐标
    LPRECT rect;//声明LPRECT结构体指针存储窗口坐标信息
    HWND hwnd=FindWindow(NULL,"憨憨");//根据上述设定的标题查找句柄,第一个形参设为NULL意味着查找系统中所有句柄
    ptrpos=(POINT*)malloc(sizeof(POINT)+64);
    rect=(LPRECT*)malloc(sizeof(LPRECT)+64);//为结构体指针分配内存空间
    for(;;){
        Sleep(500);//通过休眠指定循环周期为500毫秒
        if(GetAsyncKeyState(VK_LBUTTON)){//如果鼠标左键按下,其中VK_LBUTTON是windows.h库中定义的宏,对应鼠标左键对应的ASCII值
            GetWindowRect(hwnd,rect);//根据查找标题"憨憨"得到的句柄返回对于窗口的坐标并存储在rect中
            GetCursorPos(ptrpos);//返回鼠标对应的坐标并存储在ptrpos中
            *x=ptrpos->x-rect->left;//鼠标横坐标-控制台窗口左端横坐标得到鼠标相对控制台窗口的横坐标
            *y=ptrpos->y-rect->top;//同理得到鼠标相对的纵坐标
            break;//得到坐标后跳出循环
        }
    }

接下来,我们只需要在检测位置画上对应的UI,就可以完成判定了。

 

标签:窗口,鼠标,int,句柄,C语言,windows,坐标,台上
From: https://www.cnblogs.com/lidabo/p/16921349.html

相关文章

  • c语言指针
    学习c语言指针数遍,发现过了几天如初恋,于是决定写笔记记下来。​​&p​​​取地址​​int*p=10​​​指向变量的指针变量取值不需要记上​​*​​​​int*p=&c​​指向......
  • myos3 大学生利用C++构建一个完整的操作系统之代码重构并实现键盘打字和鼠标移动
    ​​myos1大学生利用C++构建一个完整的操作系统打印helloworld​​myos2大学生利用C++构建一个完整的操作系统之响应键盘中断myos3大学生利用C++构建一个完整的操作系统......
  • [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
     李华明Himi ​原创,转载务必在明显处注明:​上一小节的随笔写了常用的打印以及很基础的数据类型的定义方式,今天就来一起学习下如何创建类与函数的一些随笔;首先类的创建:......
  • QT图片查看器封装-鼠标中心缩放、移动、截图、框选、切换播放
    Qt图片查看器目录1      简介...12      功能实现...22.1     图片以鼠标为中心放大缩小功能...22.2     图片移动功能...42.3   ......
  • C语言学习笔记---const关键字
    1、const修饰变量被const修饰过的变量相当于常量,它的值不能被赋值改变,在整个作用域内保持固定。所以说它定义的是只读变量,在定义的时候需要给它赋初值。1constinta=......
  • C语言再学习------编译过程
    预处理---》编译--------》汇编---------》链接 1、预处理(将头文件内容及源代码汇聚处理)gcc-Etest.c-otest.i2、编译(行程汇编代码)gcc-Stest.i-otest.s3、汇......
  • 基于XQ6657Z35-EVM开发平台上TI TMS320C6657 TLV320AIC3206音频设计
    XQ6657Z35-EVM评估板是基于TI双核DSPTMS320C6657和XilinxZynqSoC处理器XC7Z035设计的多核异构平台,由核心板与底板架构组成。​SOM-XQ6657Z35核心板资源框图TMS320C6657......
  • JQuery鼠标跟随效果
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="htt......
  • C语言和设计模式(总结篇)
      设计模式的书相信很多人都看过。对于设计模式这样一种方法,相信不同的人有不同的理解。我在这里写的博客只是我个人对设计模式的粗浅认识。文中肯定存在很多的不足和不......
  • C语言和设计模式(之开篇)
      关于软件设计方面的书很多,比如《​​重构​​​》,比如《​​设计模式​​》。至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。随着时间的推移,很多的......