第一点,使用头文件
要在console里进行操作,首先先说一下ReadConsoleInput()函数。
msdn的具体解释如下:
来自https://docs.microsoft.com/en-us/windows/console/readconsoleinput
这个函数主要是用于获取控制台信息。
- 第一个参数hConsoleInput是设备参数,可以通过GetStdHandle()返回设备句柄。
- 第二个参数lpBuffer为设备中返回的信息,他是一个INPUT_RECORD的结构体组成的数组。
- 第三个参数nLength为返回的信息里需要的相应的事件数。(文档里写的是返回信息的指针数组的长度)
- 第四个参数LPWORD为返回已读记录数。
其实lpBuffer所返回的信息中,包括了多个事件,其中有FocusEvent,KeyEvent,WindowBufferSizeEvent,MouseEvent, MenuEvent多个事件。
我们这里引用鼠标事件,MouseEvent。而在lpBuffer中返回的lpBuffer.Event.MouseEvent.dwMousePosition就是鼠标在控制台界面里的所在位置。
左键单击事件
判断鼠标事件的话,就可以通过 lpBuffer.EventType == MOUSE_EVENT && lpBuffer.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED来判断左键单击事件。
左键双击事件
lpBuffer.EventType == MOUSE_EVENT && lpBuffer.Event.MouseEvent.dwEventFlags == RIGHTMOST_BUTTON_PRESSED
右键单击事件
lpBuffer.EventType == MOUSE_EVENT && lpBuffer.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED
其余的事件如下:
所以最后在程序中可以顺利判断各类鼠标状态。
简单的代码例程。
/////////////////////////
// Writen by TianHuahua//
/////////////////////////
#include "stdafx.h"
#include "windows.h"
using namespace std;
int main()
{
HANDLE ConsoleWin;
INPUT_RECORD eventMsg;
DWORD Pointer ;
ConsoleWin = GetStdHandle(STD_INPUT_HANDLE);//Get the console window
while(1){
ReadConsoleInput(ConsoleWin, &eventMsg, 1, &Pointer);//Read input msg
if (eventMsg.EventType == MOUSE_EVENT && eventMsg.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {
printf("Right button clicked.");
}
if (eventMsg.EventType == MOUSE_EVENT && eventMsg.Event.MouseEvent.dwEventFlags == RIGHTMOST_BUTTON_PRESSED) {
printf("Left button double clicked.");
}
}
return 0;
}
有一个问题需要注意:VS中编译,在头文件处,
#include "windows.h"
#include "stdafx.h"
会出现类似错误。Handle:为声明的标识符。
error C2146: 语法错误 : 缺少“;”(在标识符“hServStatus”的前面)
error C2501: “hServStatus” : 缺少存储类或类型说明符
error C2146: 语法错误 : 缺少“;”(在标识符“hSStat”的前面)
error C2501: “hSStat” : 缺少存储类或类型说明符
error C2065: “SERVICE_TABLE_ENTRY” : 未声明的标识符
error C2146: 语法错误 : 缺少“;”(在标识符“DispatchTable”的前面)
error C2065: “DispatchTable” : 未声明的标识符
error C2059: 语法错误 : “]”
error C2143: 语法错误 : 缺少“;”(在“{”的前面)
error C2143: 语法错误 : 缺少“;”(在“}”的前面)
warning C4550: 表达式计算为缺少参数列表的函数
error C2143: 语法错误 : 缺少“;”(在“,”的前面)
error C2143: 语法错误 : 缺少“;”(在“{”的前面)
error C2143: 语法错误 : 缺少“;”(在“}”的前面)
error C3861: “StartServiceCtrlDispatcher”: 即使使用参数相关的查找,也未找到标识符
error C3861: “DispatchTable”: 即使使用参数相关的查找,也未找到标识符
error C2065: “SC_HANDLE” : 未声明的标识符
error C2146: 语法错误 : 缺少“;”(在标识符“schSCManager”的前面)
error C2065: “schSCManager” : 未声明的标识符
error C2146: 语法错误 : 缺少“;”(在标识符“schService”的前面)
error C3861: “SC_HANDLE”: 即使使用参数相关的查找,也未找到标识符
error C2065: “schService” : 未声明的标识符
error C2065: “SC_MANAGER_ALL_ACCESS” : 未声明的标识符
error C3861: “schSCManager”: 即使使用参数相关的查找,也未找到标识符
error C3861: “OpenSCManager”: 即使使用参数相关的查找,也未找到标识符
error C3861: “schSCManager”: 即使使用参数相关的查找,也未找到标识符
解决方法:
改变头文件的顺序如下:
include “stdafx.h”
include
参考资料:
http://blog.csdn.net/bnb45/article/details/8042819
http://www.vcerror.com/?p=1944
原文链接: https://www.cnblogs.com/TIANHUAHUA/p/7805687.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/262886
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!