如何使用 WinAPI 检测控制台中的符号?

Posted

技术标签:

【中文标题】如何使用 WinAPI 检测控制台中的符号?【英文标题】:How to detect symbols in console with WinAPI? 【发布时间】:2020-09-26 04:19:06 【问题描述】:

我需要在控制台中读取文件并打印文本。如果用户单击单词中的字母,则在控制台底部显示该字母并显示鼠标坐标。 我想出了如何使用 LPPOINT 跟踪鼠标点击和使用 GetCursorPos() 的光标位置。但我找不到如何检测用户点击的符号。我想,我不应该使用 printf() 或 WriteFile() 并使用一些特定的功能? 我现在有这段代码:

#include <stdio.h>
#include <locale.h>
#include <windows.h>

void main ()

    DWORD fdwMode;
    HANDLE file  = CreateFile("lab5.in",GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
    HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE hstdin  = GetStdHandle(STD_INPUT_HANDLE);
    HWND hwnd = GetConsoleWindow(); // Дескриптор консольного окна

COORD pos;
pos.X = 10;
pos.Y = 10;

INPUT_RECORD ir;
fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS;
DWORD actlen = 1;

char buf[100];
char buffer;
char buf1;
 

if(hstdout==INVALID_HANDLE_VALUE) 
    ExitProcess(0);


// мышь
LPPOINT pPnt; // координаты мыши
pPnt = malloc ( sizeof(*pPnt) ); // память под переменную координат мыши
while (actlen != 0) 
    ReadFile(file,&buf,1,&actlen,NULL);
    WriteFile(hstdout,&buf,actlen,&actlen,NULL);
do 
    Sleep(100);
    GetCursorPos(pPnt); // Координаты курсора мыши (глобальные, весь экран)
    ScreenToClient(hwnd, pPnt); // преобразуем координаты в локальные (окно консоли)
    // printf("\n Cursor Position: %d %d \n", pPnt[0].x, pPnt[0].y);

    if (GetKeyState(VK_LBUTTON) < 0) 
        printf("\n Left Button Entered \n");
    if (GetKeyState(VK_RBUTTON) < 0) 
        exit(0);
    while(1);

对不起我的英语:)

【问题讨论】:

【参考方案1】:

我假设您的所有文本都已输出到控制台缓冲区。

使用ReadConsoleOutputCharacter,

从控制台的连续单元格中复制多个字符 屏幕缓冲区,从指定位置开始。

dwReadCoord:控制台屏幕中第一个单元格的坐标 从中读取的缓冲区,以字符为单位。 COORD的X成员 结构是列,Y 成员是行。

使用GetCursorPos获取光标在控制台缓冲区的位置,然后通过一些计算得到单元格坐标。

【讨论】:

以上是关于如何使用 WinAPI 检测控制台中的符号?的主要内容,如果未能解决你的问题,请参考以下文章

Winapi检测按钮悬停

WinAPI:如何强制 DATETIMEPICKER 使用标准日历而不是本地日历设置

如何检测二进制/库中的未定义符号?

使用winapi进行远程程序控制[关闭]

如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节

WINAPI 键盘检测其他应用程序热键