Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Мышь в С++ в консольном приложении в текстовом режиме

Ответить
Настройки темы
C/C++ - Мышь в С++ в консольном приложении в текстовом режиме

Новый участник


Сообщения: 38
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Возможно ли такое? И как это организовать

Отправлено: 17:57, 23-11-2009

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Smile, там есть каретка, ей можно управлять.
Ну, а если хочется работать ещё и с мышью то вот

Отправлено: 18:21, 23-11-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 38
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


http://www.break-people.ru/cmsmade/i..._mouse_console
вот)))

Отправлено: 18:33, 23-11-2009 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Smile, любопытно. Особенно #include<dos.h>, впрочем файл то нашёлся, а вот 'REGPACK' : undeclared identifier так что не для всех компиляторов ИМХО.
P.S.
IDE - Microsoft Visual C++ 2008 Express Edition

Отправлено: 19:01, 23-11-2009 | #4


Новый участник


Сообщения: 38
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip DOS.zip
(4.2 Kb, 6 просмотров)

Ну я ее не использую так как мой колледж отстает в развитии. Попробуй библиотеку dos.h c Turbo C.

Отправлено: 17:42, 25-11-2009 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Smile спасибо, доступ к Turbo C есть.
А замена dos.h врятле позволит скомпилировать без ошибок предложенный код, ибо компиляторы слишком разные.
Там даже указанно, что б не пробовали применять код в более новых компиляторах от Борланд, куда уж там от MS.

Ну, а для MSVC будем примерно так

Код: Выделить весь код
#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK ConsoleFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_MOUSEMOVE:
        POINT curPoint = {0};
        GetCursorPos(&curPoint);
        
        RECT winRect = {0};
        GetWindowRect(hWnd, &winRect);

        CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
        GetConsoleScreenBufferInfo((HANDLE)wParam, &csbi);

        COORD coord = {0};
        coord.X = (SHORT)(((curPoint.x - winRect.left) * csbi.dwSize.X)/650);
        coord.Y = (SHORT)(((curPoint.y - winRect.top) * csbi.dwSize.Y)/325);

        wchar_t Coords[25]=L"";
        swprintf(Coords, 25, L"%i %i (MAX = {%i %i})", coord.X, coord.Y, csbi.dwSize.X, csbi.dwSize.Y);
        SetConsoleTitle(Coords);
        //wprintf(L"%i %i", coord.X, coord.Y);
        //wprintf(L"\b\b\b\b\b\b");
        coord.Y -= 100;
        WORD wColors = 112;
        DWORD cWritten;
        WriteConsoleOutputAttribute((HANDLE)wParam, &wColors, 1, coord, &cWritten);
        coord.X +=1;
        WriteConsoleOutputAttribute((HANDLE)wParam, &wColors, 1, coord, &cWritten);
    break;
    }
    return 0;
}

int main(int argc, wchar_t *argv[])
{
    HWND hWndConsole = GetConsoleWindow();
    WNDPROC OldWndProc = (WNDPROC)GetWindowLongPtr(hWndConsole, GWLP_WNDPROC);
    SetWindowLongPtr (hWndConsole, GWLP_WNDPROC, (LONG_PTR)ConsoleFunc);
    
    HANDLE hStdin = GetStdHandle (STD_INPUT_HANDLE);
    INPUT_RECORD inrec = {0};
    DWORD cWritten;
    FlushConsoleInputBuffer(hStdin);
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

    do
    {
        ReadConsoleInput(hStdin, &inrec, 1, &cWritten);
        CallWindowProc (ConsoleFunc, hWndConsole, WM_MOUSEMOVE, (WPARAM)hStdout, 0L);
    }
    while(inrec.Event.KeyEvent.wVirtualKeyCode != VK_ESCAPE);
    
    SetWindowLongPtr(hWndConsole, GWLP_WNDPROC, (LONG_PTR)OldWndProc);
    return 0;
}
По непонятной причине по вертикале нужно выравнивание coord.Y -= 100;, что бы хотя бы увидеть курсор, когда мышь на середине консольного окна. При этом чувствительность слишком большая: курсор уходит за пределы окна при незначительных изменениях положения в вертикальной плоскости.
Значения 650 и 325 получены экспериментальным путём, обеспечивают коррекцию координат, разделяя пиксель координату на экране. Переводя, таким образом, в позицию в консольном окне, где значения по горизонтали от 0 до 80 и от 0 до 300 по вертикали.
Конкретные граничные значение уточняет функция GetConsoleScreenBufferInfo()
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:29, 26-11-2009 | #6


Новый участник


Сообщения: 38
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


А может бы и получилось)))

Отправлено: 16:41, 26-11-2009 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Мышь в С++ в консольном приложении в текстовом режиме

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Частота обновления экрана в текстовом режиме DTF Общий по Linux 1 29-04-2007 19:56
*SOFT* | Псевдографика в консольном приложении MAXY Программирование и базы данных 20 28-01-2006 11:53
Как в Си изменять цвет букв и фона в текстовом режиме FatalBSD Программирование и базы данных 3 08-07-2004 14:09
Разрешение в текстовом режиме netmax Программирование и базы данных 1 12-04-2003 18:48
Проблемы с видео в текстовом режиме GateKeeper Общий по Linux 7 03-04-2003 05:47




 
Переход