我刚学C语言,我想做一个,在控制台用鼠标点击某个位置,然后再控制台上输出一句话.请各位大侠帮帮忙?
// temp1.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include windows.h
#include conio.h
#include stdlib.h
int main(int argc, char* argv[])
{
SetConsoleTitle(“1111111111”);
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
INPUT_RECORD inRec;
DWORD res;
while (1)
{
ReadConsoleInput(hInput, inRec, 1, res);
if (inRec.EventType == MOUSE_EVENT inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),inRec.Event.MouseEvent.dwMousePosition);
printf(“Hello World!”);
}
Sleep(100);
}
return 0;
}
C语言在控制台清屏之后鼠标定位就不行了怎么办
楼主你好。
是因为程序卡在这里了:
Y=(int)pos.Y;
if
(inRec.EventType
==
MOUSE_EVENT
inRec.Event.MouseEvent.dwButtonState
==
FROM_LEFT_1ST_BUTTON_PRESSEDY=3Y=1)
//鼠标左键
break;
这里无法break出来。原因是Y=3Y=1这个条件无法满足。
程序还在调试中。
【旧代码省略】
以上调试程序可以看到只要不system(“cls”)就可以持续读入鼠标事件,但是只要取消system(“cls”)的注释,在清屏一次之后就会无法读入鼠标事件,程序卡在ReadConsoleInput处,只能读入键盘和聚焦事件什么的。暂时分析到这里。
我用clrscr()代替system(“cls”)成功了!(clrscr你可以查查百度百科)
#include
windows.h
#include
conio.h
#include
stdlib.h
#include
stdio.h
#define
PERR(bSuccess,
api){if(!(bSuccess))
printf(“%s:Error
%d
from
%s
on
line
%d\n”,
__FILE__,
GetLastError(),
api,
__LINE__);}
void
MyCls(HANDLE)
;
void
clrscr(void)
{
HANDLE
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
MyCls(hStdOut);
return;
}
void
MyCls(HANDLE
hConsole)
{
COORD
coordScreen={0,0};//设置清屏后光标返回的屏幕左上角坐标
BOOL
bSuccess;
DWORD
cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO
csbi;//保存缓冲区信息
DWORD
dwConSize;//当前缓冲区可容纳的字符数
bSuccess=GetConsoleScreenBufferInfo(hConsole,csbi);//获得缓冲区信息
PERR(bSuccess,”GetConsoleScreenBufferInfo”);
dwConSize=csbi.dwSize.X
*
csbi.dwSize.Y;//缓冲区容纳字符数目
//用空格填充缓冲区
bSuccess=FillConsoleOutputCharacter(hConsole,(TCHAR)’
‘,dwConSize,coordScreen,cCharsWritten);
PERR(bSuccess,”FillConsoleOutputCharacter”);
bSuccess=GetConsoleScreenBufferInfo(hConsole,csbi);//获得缓冲区信息
PERR(bSuccess,”ConsoleScreenBufferInfo”);
//填充缓冲区属性
bSuccess=FillConsoleOutputAttribute(hConsole,csbi.wAttributes,dwConSize,coordScreen,cCharsWritten);
PERR(bSuccess,”FillConsoleOutputAttribute”);
//光标返回屏幕左上角坐标
bSuccess=SetConsoleCursorPosition(hConsole,coordScreen);
PERR(bSuccess,”SetConsoleCursorPosition”);
return;
}
void
main()
{
int
fh();
int
ret;
HANDLE
hInput
=
GetStdHandle(STD_INPUT_HANDLE);;
//
获取标准输入设备句柄
for(;;)
{
printf(“请点击鼠标左键\n”);
ret
=
fh(hInput);
printf(“%d\n”,ret);
Sleep(200);
clrscr();
}
}
int
fh(HANDLE
hInput)
{
INPUT_RECORD
inRec;
DWORD
res;
int
Y;
COORD
pos
=
{0,
0};
for(;;)
{
ReadConsoleInput(hInput,
inRec,
1,
res);
pos
=
inRec.Event.MouseEvent.dwMousePosition;
Y=(int)pos.Y;
if
(inRec.EventType
==MOUSE_EVENT
inRec.Event.MouseEvent.dwButtonState
==
FROM_LEFT_1ST_BUTTON_PRESSED){
//鼠标左键
break;
}
}
return
Y;
}
c语言控制台读不到鼠标的信息
#include
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), cursor_info);
}
函数结构体都windows.h定义函数用简单说
CONSOLE_CURSOR_INFO结构体定义:
typedef struct
{ DWORD dwSize;
BOOL bVisible; //0光标见
}CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
VCMinGW均没问题
明白直接Hi
C语言是怎样实现鼠标事件控制的?可不可以用纯C做?
可以,需要调用windowsAPI函数。
头文件windows.h。
简单思路:
通过GetStdHandle获取标准输入句柄。
再通过ReadConsokeInput将输入信息存储到结构体类型INPUT_RECODE变量中。
再通过判断,截取到鼠标电击的事件。
具体API函数、参数、功能还有很多。需要网上找资料可以学。
我这里就简单写一个,鼠标点击控制台任意位置,并在该位置打印字符串。
#include stdio.h
#include windows.h
int main()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
INPUT_RECORD inRec;
DWORD res;
COORD p0;
while(1)
{
ReadConsoleInput(hInput, inRec, 1, res);
if (inRec.EventType == MOUSE_EVENT inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
{
p0.X=inRec.Event.MouseEvent.dwMousePosition.X;
p0.Y=inRec.Event.MouseEvent.dwMousePosition.Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
printf(“你在这里点击的左键\n”);
}
}
return 0;
}