控制台界面控制(十):读取鼠标操作
2016-01-07 19:44
316 查看
本文为转载文档,原文链接:http://blog.csdn.net/bnb45/article/details/8042819
我在看到这一章之前一直不知道控制台也能通过鼠标来操作。控制台的鼠标操作需要得到鼠标位置信息,左右键信息,单双击等等。
[cpp] view
plaincopy
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition; // 当前鼠标位置
DWORD dwButtonState; // 鼠标按钮状态
DWORD dwControlKeyState; // 键盘控制键状态
DWORD dwEventFlags; // 事件状态
} MOUSE_EVENT_RECORD;
第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;第二个参数(dwButtonState)为鼠标的按键状态,包含的值如下:
第三个参数是键盘控制键状态,这个和上一章的内容是一样的;最后一个参数(dwEventFlag)为事件状态:
plaincopy
#include <windows.h>
#include <stdio.h>
int main(void)
{
// 获取标准输入输出设备句柄
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
COORD crPos, crHome = {0, 0};
printf("[Cursor Position] X: %2lu Y: %2lu\n", 0, 0); // 初始状态
while (1)
{
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if (mouseRec.EventType == MOUSE_EVENT)
{
if (mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)
{
if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
{
break; // 左键双击 退出循环
}
}
crPos = mouseRec.Event.MouseEvent.dwMousePosition;
GetConsoleScreenBufferInfo(hOut, &bInfo);
SetConsoleCursorPosition(hOut, crHome);
printf("[Cursor Position] X: %2lu Y: %2lu", crPos.X, crPos.Y);
SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition);
switch (mouseRec.Event.MouseEvent.dwButtonState)
{
case FROM_LEFT_1ST_BUTTON_PRESSED: // 左键 输出A
FillConsoleOutputCharacter(hOut, 'A', 1, crPos, &res);
break; // 如果使用printf输出,则之前需要先设置光标的位置
case RIGHTMOST_BUTTON_PRESSED: // 右键 输出a
FillConsoleOutputCharacter(hOut, 'a', 1, crPos, &res);
break;
default:
break;
}
}
}
CloseHandle(hOut); // 关闭标准输出设备句柄
CloseHandle(hIn); // 关闭标准输入设备句柄
return 0;
}
我在看到这一章之前一直不知道控制台也能通过鼠标来操作。控制台的鼠标操作需要得到鼠标位置信息,左右键信息,单双击等等。
效果
当鼠标在控制台范围内的时候,第一行会显示鼠标的位置;左键单击在鼠标当前位置写下一个A,右键单击在鼠标当前位置写下一个a;左键双击控制台退出。相关信息
与读取键盘信息类似,读取鼠标信息也是通过 ReadConsoleInput 函数来实现,区别在判断了 MOUSE_EVENT 后,将使用 MOUSE_EVENT_RECORD:[cpp] view
plaincopy
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition; // 当前鼠标位置
DWORD dwButtonState; // 鼠标按钮状态
DWORD dwControlKeyState; // 键盘控制键状态
DWORD dwEventFlags; // 事件状态
} MOUSE_EVENT_RECORD;
第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;第二个参数(dwButtonState)为鼠标的按键状态,包含的值如下:
鼠标按键状态码(dwButtonState) | 说明 |
FROM_LEFT_1ST_BUTTON_PRESSED | 最左边按键 |
RIGHTMOST_BUTTON_PRESSED | 最右边按键 |
FROM_LEFT_2ND_BUTTON_PRESSED | 左起第二个按键 |
FROM_LEFT_3RD_BUTTON_PRESSED | 左起第三个按键 |
FROM_LEFT_4TH_BUTTON_PRESSED | 左起第四个按键 |
事件状态码(dwEventFlag) | 说明 |
DOUBLE_CLICK | 双击 |
MOUSE_MOVED | 移动 |
MOUSE_WHEELED | 滚轮滚动(只适用于Windows 2000/XP) |
控制台读取鼠标信息
[cpp] viewplaincopy
#include <windows.h>
#include <stdio.h>
int main(void)
{
// 获取标准输入输出设备句柄
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
COORD crPos, crHome = {0, 0};
printf("[Cursor Position] X: %2lu Y: %2lu\n", 0, 0); // 初始状态
while (1)
{
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if (mouseRec.EventType == MOUSE_EVENT)
{
if (mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)
{
if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
{
break; // 左键双击 退出循环
}
}
crPos = mouseRec.Event.MouseEvent.dwMousePosition;
GetConsoleScreenBufferInfo(hOut, &bInfo);
SetConsoleCursorPosition(hOut, crHome);
printf("[Cursor Position] X: %2lu Y: %2lu", crPos.X, crPos.Y);
SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition);
switch (mouseRec.Event.MouseEvent.dwButtonState)
{
case FROM_LEFT_1ST_BUTTON_PRESSED: // 左键 输出A
FillConsoleOutputCharacter(hOut, 'A', 1, crPos, &res);
break; // 如果使用printf输出,则之前需要先设置光标的位置
case RIGHTMOST_BUTTON_PRESSED: // 右键 输出a
FillConsoleOutputCharacter(hOut, 'a', 1, crPos, &res);
break;
default:
break;
}
}
}
CloseHandle(hOut); // 关闭标准输出设备句柄
CloseHandle(hIn); // 关闭标准输入设备句柄
return 0;
}
相关文章推荐
- RTTI-运行时类型识别
- Android加载so出现dlopen failed: empty/missing DT_HASH in "libx.so" (built with --hash-style=gnu?)错误
- Session与Cookie
- 控制台界面控制(九):读取键盘操作
- android之基于Zxing二维码扫描
- request获取路径的方式和区别
- 消息推送技术
- java 知识点百题 第一季
- nodejs监控目录
- 欢迎使用CSDN-markdown编辑器
- 反应器模式
- Oracle可插拔数据库的jdbc连接串写法
- Oracle可插拔数据库的jdbc连接串写法
- Apache+mod_cluster+jboss EAP5.1搭建详解
- 【自用】线段树 区间最小值
- 网络唤醒无需任何软件 实现局域网广域网远程唤醒计算机
- 数据库设计和SQL编写规范
- session原理总结
- Linux下的makefile相关内容
- Apache2.2+mod_jk1.2+tomcat 6.0