文章详情
C++控制台获取鼠标在自身窗口点击的坐标
Posted on 2023-03-15 03:08:00 by 主打一个C++
#include <iostream>
#include <Windows.h>
//热键
#define D_IS_KEY(_vk) ((GetAsyncKeyState(_vk) & 0x8000) ? true : false)
bool GetConsoleWH(int& _w,int& _h) {
// 获取控制台句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE != hConsole) {
// 获取控制台信息
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hConsole, &csbi)) {
// 宽度和高度
_w = csbi.srWindow.Right - csbi.srWindow.Left + 1; // 注意加1
_h = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; // 注意加1
//printf("%d %d\n", width, height);
return true;
}
}
return false;
}
bool HideCursor() {
//隐藏控制台光标
CONSOLE_CURSOR_INFO curinfo;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE != handle) {
if (GetConsoleCursorInfo(handle, &curinfo)) {
curinfo.bVisible = FALSE;
//重设
return (bool)SetConsoleCursorInfo(handle, &curinfo);
}
}
return false;
}
bool ProhibitInput() {
//禁止所有输入
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
if (INVALID_HANDLE_VALUE != handle) {
DWORD mode = 0;
if (GetConsoleMode(handle, &mode)) {
mode &= ~ENABLE_QUICK_EDIT_MODE;
mode &= ~ENABLE_INSERT_MODE;
mode &= ~ENABLE_MOUSE_INPUT;
return (bool)SetConsoleMode(handle, mode);
}
}
return false;
}
int main() {
//隐藏光标
HideCursor();
//获取窗口宽高
int w, h;
GetConsoleWH(w, h);
//禁止输入等
ProhibitInput();
//获取控制台句柄
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//获取当前激活窗口
HWND currWin = GetForegroundWindow();
//字体
CONSOLE_FONT_INFO consoleFont;
POINT curPos;
do
{
//判断热键
if (D_IS_KEY(VK_LBUTTON)) {
//获取鼠标位置
GetCursorPos(&curPos);
//获取鼠标在窗口上的位置
ScreenToClient(currWin, &curPos);
//获取字体信息
GetCurrentConsoleFont(handle, FALSE, &consoleFont);
//得到实际
curPos.x /= consoleFont.dwFontSize.X;
curPos.y /= consoleFont.dwFontSize.Y;
//排除非窗口区域
if ((curPos.x > 0) && (curPos.y > 0) && (curPos.x < w) && (curPos.y < h)) {
printf("x=%d y=%d\n", curPos.x, curPos.y);
//防三击
Sleep(333);
}
}
//常规延迟
Sleep(20);
} while (!D_IS_KEY(VK_ESCAPE));
printf("程序结束!\n");
return 0;
}
*转载请注明出处:原文链接:https://cpp.vin/page/38.html