|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
望请各位大佬解答一下问题
我在学习控制台界面的设计的时候,想通过鼠标点击来改变控制台的光标位置,但是同样的代码在VS2017和VC6.0下有不同的效果,VS2017是程序功能无效,但是VC6.0下程序正常运行。
网上百度说是应该关闭控制台的快速编辑功能(win10下)但是无效果。
然后我在WINXP下用VS2010和VC6.0编译,也是只有VC6.0可以使程序正常运行,我想应该和系统和VS版本有关系。
所以请各位大佬帮帮小弟。求助!
代码如下:
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 };
cout << "[Cursor Position] X: " << "0" << " Y: 0" << endl;//?初始状态??
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);
cout << "[Cursor Position] X: " << crPos.X << " Y: " << crPos.Y << endl;//?初始状态??
SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition);
switch(mouseRec.Event.MouseEvent.dwButtonState)
{
case FROM_LEFT_1ST_BUTTON_PRESSED: //?左键?输出A?
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crPos);
cout << '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;
}
这是在VC6.0下编译,功能实现
这是在VC6.0下编译,功能实现
这是在VS2017下编译,功能不能实现
这是在VS2017下编译,功能不能实现
再次感谢各位大神。
本帖最后由 人造人 于 2018-10-4 23:38 编辑 #include <iostream>
#include <windows.h>
static void HideCursor()
{
CONSOLE_CURSOR_INFO cci;
cci.bVisible = FALSE;
cci.dwSize = sizeof(cci);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cci);
}
int main()
{
HideCursor();
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD ir;
DWORD cNumRead;
COORD coord = {0, 0};
do
{
SetConsoleCursorPosition(hStdout, {0, 0});
std::cout << " ";
SetConsoleCursorPosition(hStdout, {0, 0});
std::cout << "[Cursor Position] X: " << coord.X << " Y: " << coord.Y;
ReadConsoleInput(hStdin, &ir, 1, &cNumRead);
coord = ir.Event.MouseEvent.dwMousePosition;
if(ir.EventType == MOUSE_EVENT)
{
if(ir.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
{
if(ir.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
break;
}
switch(ir.Event.MouseEvent.dwButtonState)
{
case FROM_LEFT_1ST_BUTTON_PRESSED:
FillConsoleOutputCharacter(hStdout, 'A', 1, coord, &cNumRead);
break;
case RIGHTMOST_BUTTON_PRESSED:
FillConsoleOutputCharacter(hStdout, 'a', 1, coord, &cNumRead);
break;
}
}
}
while(1);
CloseHandle(hStdout);
CloseHandle(hStdin);
return 0;
}
|
|