Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/47: Рейтинг темы: голосов - 47, средняя оценка - 4.57
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48

Нажатие кнопок мыши в консоле на С++

08.01.2021, 15:41. Показов 9864. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!!!
Помогите решить проблему.
Дан код для консольного приложения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"user32")
using namespace std;
 
int main()
{
    string txt;
 
    for(int i=0;i <100;i++ ){
        keybd_event (VK_LBUTTON,0,0,0);
  
        cout << i <<endl;
        Sleep(100);
    }
    
    return 0;
}
Это обычный цикл на черном консольном фоне.
Проблема в том, что при нажатие левой кнопки мыши,
почему-то код останавливается. При нажатие правой кнопки
мыши все снова работает.
Как реализовать чтоб при нажатие
левой кнопки мыши появлялась какое нибудь сообщение
в консоле например Hello World, а при нажатие правой кнопки
мыши появлялась другое сообщение, например A good day

Добавлено через 2 минуты
Если стереть keybd_event (VK_LBUTTON,0,0,0);
все равно при нажатие левой мыши программа останавливается,
а при правой работает. Редакторы Dev C++ и Visual C++
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2021, 15:41
Ответы с готовыми решениями:

Самопроизвольное нажатие кнопок мыши
Добрый день. Сегодня возникла не приятная ситуация - ключит мышь Но Сама мышь как я понял не причем, вставлял с другого компа ( правда...

Одновременное нажатие обеих кнопок мыши
Как отловить нажатие одновременно правой и левой кнопки мыши, чтобы потом написать для этого события обработчик?

Откомпилированное приложение не отвечает на нажатие кнопок мыши
запускаю игру но она не отвечает. что делать? помогите пожалуйста

17
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
08.01.2021, 16:01
Цитата Сообщение от Роман72234 Посмотреть сообщение
keybd_event (VK_LBUTTON,0,0,0);
Аргументов кажется не хватает. Эмулировал недавно нажатия мыши и там был не один аргумент. Щас скину попробуй протестить

Добавлено через 2 минуты
Кстати можно ещё вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <Windows.h>
 
using namespace std;
int main()
{
    while (1)
    {
        if (GetKeyState(VK_LBUTTON) & 0x8000)
            cout << 1 << endl;
        else
            cout << 0 << endl;
        Sleep(5);
    }
}
Добавлено через 5 минут
Мой кусочек кода определяет зажата ли клавиша. Для определения была ли нажата нужно иным путем работать. Щас поищу

Добавлено через 1 минуту
Цитата Сообщение от Роман72234 Посмотреть сообщение
Проблема в том, что при нажатие левой кнопки мыши,
почему-то код останавливается. При нажатие правой кнопки
мыши все снова работает.
Вы кликаете по консоли и она начинает ждать ввода. нажимаете энтер и программа продолжает работать. Если кликать вне окошка консоли - всё будет работать и ничего не будет останавливаться

Добавлено через 4 минуты
Цитата Сообщение от Laborant666 Посмотреть сообщение
if (GetKeyState(VK_LBUTTON) & 0x8000)
Вот это кстати если заменить на if (GetKeyState(VK_LBUTTON) <0) - будет тот же результат - зажата кнопка печатаются 1, отжата - печатаются 0.
Если заменить на if (GetKeyState(VK_LBUTTON)) без сравнения то будет работать как переключатель. Печатаются 0 например, нажали клавишу - печатаются 1. Отпустили - печатаются 1. Нажали ещё раз - печатаются 1. Отпустили - печатаются 0. Грубо говоря переключатель

Добавлено через 4 минуты
Цитата Сообщение от Роман72234 Посмотреть сообщение
keybd_event (VK_LBUTTON,0,0,0);
Если что это не проверка "нажата ли клавиша" а эмуляция того, что вы клавишу нажали
0
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48
08.01.2021, 16:35  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <Windows.h>
 
using namespace std;
int main()
{
    while (1)
    {
        if (GetKeyState(VK_LBUTTON) & 0x8000)
            cout << 1 << endl;
        else
            cout << 0 << endl;
        Sleep(5);
    }
}
При применение этого кода ни чего не изменилась,также при нажатие ЛКМ все останавливается а при ПКН возобновляется . Но что я заметил. Смотреть два рисунка:
Миниатюры
Нажатие кнопок мыши в консоле на С++   Нажатие кнопок мыши в консоле на С++  
0
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48
08.01.2021, 16:49  [ТС]
Как быть и что не так

Добавлено через 8 минут
Laborant666 :Вы кликаете по консоли и она начинает ждать ввода. нажимаете энтер и программа продолжает работать. Если кликать вне окошка консоли - всё будет работать и ничего не будет останавливаться
Мой ответ: мне нужно чтоб при нажатие левой кнопки мыши цикл не останавливался а что то писала
...if (GetKeyState(VK_LBUTTON) & 0x8000)
cout << 1 << endl;...
Единица не появляется
Сейчас заметил что если ЛКМ нажать за консалью появляется единицы а при отжатие нули
Если курсор мыши подвести в черное окно консоли и нажать ЛКН то цикл оастанавливается.
А если при подведение курсора мыши в консль как то ее отключить для консоли но при этом
при нажатие ЛКМ ни чего не останавливалась работала как при нажатие за консолью

Добавлено через 5 минут
на рисунке222222. png при нажатие правой кнопке мыше (не левой)
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
08.01.2021, 16:55
Роман72234, зачем вам вообще нажатия по консоли, если обычно программы на отлов нажатий свернуты и не мешают? Погуглите, как заставить игнорировать нажатия мыши консолью. Тут уж не помогу

Добавлено через 59 секунд
Что б цитировать мои слова - выделяете мышью текст и появляется кнопка цитировать - текст вставится в поле ввода. Что б ответить мне жмите по моему нику слева от моих сообщений, иначе мне не приходит оповещений
0
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
08.01.2021, 16:58
Я не уверен, пригодится ли вам то, что я сейчас скину, но я как-то хотел упороться написанием своего консольного ГУИ. Слава небесным доспехам, меня быстро отпустило)) Можете глянуть на то, как я было реализовал "button" контрол. Авось и поможет чем (да, код грязный, но "такова селяви"):
GUI.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma once
 
#include <Windows.h>
#include <vector>
 
struct SMouseState {
    int x, y;
    bool pressed;
};
 
class CConsoleGUI {
public:
    void Initialize();
    void Shutdown();
 
    void SimpleText(int x, int y, const char* text);
    void Text(int x, int y, const char* text, ...);
    void CenteredText(int y, const char* text, ...);
    bool Button(int x, int y, int w, const char* label);
    bool CenteredButton(int y, int w, const char* label);
    
    bool Redraw();
 
    void SetTextColor(int color);
    void SetBackgroundColor(int color);
 
private:
    HANDLE stdInput = 0, stdOutput = 0;
    DWORD inputMode = 0, oldInputMode = 0;
    SMouseState mouse;
 
    void GetMousePos(MOUSE_EVENT_RECORD mer);
    void SetMousePos(int x, int y);
};
 
extern CConsoleGUI GUI;
GUI.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#include "GUI.hpp"
 
#include <iostream>
 
CConsoleGUI GUI;
 
void KeyEventProc(KEY_EVENT_RECORD ker)
{
    /*printf("Key event: ");
 
    if (ker.bKeyDown)
        printf("key pressed");
    else printf("key released");*/
}
 
void MouseEventProc(MOUSE_EVENT_RECORD mer)
{
    switch (mer.dwEventFlags) {
 
    case 0:
        if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {
            //printf("left button pressed");
        }
        else if (mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
        {
            //printf("right button pressed");
        }
        else
        {
            //printf("button press");
        }
        break;
    case DOUBLE_CLICK:
        //printf("double click");
        break;
    case MOUSE_HWHEELED:
        //printf("horizontal mouse wheel");
        break;
    case MOUSE_MOVED:
        //printf("mouse moved");
        break;
    case MOUSE_WHEELED:
        //printf("vertical mouse wheel");
        break;
    default:
        //printf("unknown");
        break;
    }
 
}
 
void CConsoleGUI::Initialize() {
    this->stdInput = GetStdHandle(STD_INPUT_HANDLE);
    this->stdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    //if (this->hStdInput == INVALID_HANDLE_VALUE)
    //  error("GetStdHandle");
 
    HWND wnd = GetConsoleWindow();
    RECT rect;
    GetWindowRect(wnd, &rect);
    MoveWindow(wnd, rect.left, rect.top, 400, 400, TRUE);
 
    SetWindowLong(wnd, GWL_STYLE,
        GetWindowLong(wnd, GWL_STYLE) &
        ~WS_MAXIMIZEBOX & ~WS_SIZEBOX);
 
    /*CONSOLE_SCREEN_BUFFER_INFOEX csbi;
    GetConsoleScreenBufferInfoEx(this->stdOutput, &csbi);
    csbi.cbSize = sizeof(csbi);
    //csbi.ColorTable[0] = RGB(0, 0, 0);
    csbi.ColorTable[1] = RGB(70, 1, 1);
    BOOL ret = SetConsoleScreenBufferInfoEx(this->stdOutput, &csbi);
    SetConsoleTextAttribute(this->stdOutput, (WORD)((15 << 4) | 0));*/
 
    COORD crd = { 50, 30 };
    SMALL_RECT src = { 0, 0, crd.X - 1, crd.Y - 1 };
    SetConsoleWindowInfo(this->stdOutput, TRUE, &src);
    SetConsoleScreenBufferSize(this->stdOutput, crd);
    
    if (!GetConsoleMode(this->stdInput, &this->oldInputMode))
        ;
        //ErrorExit("GetConsoleMode");
 
    this->inputMode = ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
    if (!SetConsoleMode(this->stdInput, this->inputMode))
        ;
        //error("SetConsoleMode");
}
 
void CConsoleGUI::Shutdown() {
    SetConsoleMode(this->stdInput, this->oldInputMode);
}
 
void CConsoleGUI::SimpleText(int x, int y, const char* text) {
    this->SetMousePos(x, y);
    printf(text);
}
 
void CConsoleGUI::Text(int x, int y, const char* text, ...) {
    this->SetMousePos(x, y);
 
    char        output[256];
    va_list     argumentPtr;
 
    va_start(argumentPtr, text);
    vsprintf_s(output, text, argumentPtr);
    va_end(argumentPtr);
    printf(output);
}
 
void CConsoleGUI::CenteredText(int y, const char* text, ...) {
    char        output[256];
    va_list     argumentPtr;
 
    va_start(argumentPtr, text);
    vsprintf_s(output, text, argumentPtr);
    va_end(argumentPtr);
 
    this->SetMousePos((50 / 2) - (strlen(output) / 2), y);
 
    printf(output);
}
 
bool CConsoleGUI::Button(int x, int y, int w, const char* label) {
    this->SetMousePos(x, y);
    printf(label);
 
    return true;
}
 
bool CConsoleGUI::CenteredButton(int y, int w, const char* label) {
    int x = (50 / 2) - (strlen(label) / 2);
 
    bool hovered = (mouse.x >= x && mouse.x <= x + strlen(label) && mouse.y == y);
    bool pressed = false;
    
    if (hovered) 
        SetConsoleTextAttribute(this->stdOutput, BACKGROUND_GREEN | BACKGROUND_INTENSITY);
    else
        SetConsoleTextAttribute(this->stdOutput, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
        
    this->SetMousePos(x, y);
 
    if (mouse.pressed && hovered)
        pressed = true;
    else
        printf(label);
 
    SetConsoleTextAttribute(this->stdOutput, (WORD)(0 << 4) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    return pressed;
}
 
bool CConsoleGUI::Redraw() {
    INPUT_RECORD irInBuf[128];
    DWORD numRead;
 
    if (!ReadConsoleInputA(this->stdInput, irInBuf, 128, &numRead))
        return true;
        //ErrorExit("ReadConsoleInput");
    
    for (int i = 0; i < numRead; i++)
    {
        switch (irInBuf[i].EventType)
        {
        case KEY_EVENT: // keyboard input 
            KeyEventProc(irInBuf[i].Event.KeyEvent);
            break;
 
        case MOUSE_EVENT:
            this->GetMousePos(irInBuf[i].Event.MouseEvent);
            break;
 
        case FOCUS_EVENT:  // disregard focus events 
            break;
 
        case MENU_EVENT:   // disregard menu events 
            break;
 
        default:
            break;
        }
    }
 
    return true;
}
 
void CConsoleGUI::SetTextColor(int color) {
    SetConsoleTextAttribute(this->stdOutput, color);
}
 
void CConsoleGUI::SetBackgroundColor(int color) {
    if(color == 0)
        SetConsoleTextAttribute(this->stdOutput, (WORD)(color << 4) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    else
        SetConsoleTextAttribute(this->stdOutput, (WORD)(color << 4));
}
 
void CConsoleGUI::GetMousePos(MOUSE_EVENT_RECORD mer)
{
    mouse.pressed = false;
 
    int x, y;
    INPUT_RECORD Inrec;
    DWORD evRead;
 
    if(ReadConsoleInputA(this->stdInput, &Inrec, 1, &evRead)) {
        x = Inrec.Event.MouseEvent.dwMousePosition.X;
        y = Inrec.Event.MouseEvent.dwMousePosition.Y;
 
        mouse.x = x;
        mouse.y = y;
 
        if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            mouse.pressed = true;
    }
}
 
void CConsoleGUI::SetMousePos(int x, int y) {
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(this->stdOutput, pos);
}
Пример использования (вроде как закоменитил всё лишнее):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <string>
#include <ctime>
#include <iostream>
 
#include "GUI.hpp"
//#include "Utils.hpp"
//#include "Inject.hpp"
//#include "version.hpp"
 
int main() {    
    srand(time(0));
 
    //char buf[256];
    //sprintf_s(buf, "SoftON Loader [build %i]", __BUILDNUM__);
    //SetConsoleTitleA(buf);
 
    HW_PROFILE_INFO hwProfileInfo;
    GetCurrentHwProfileA(&hwProfileInfo);
    bool isDev = strstr(hwProfileInfo.szHwProfileGuid, "{92E90B0F-94B2-7D9C-BFB9-0A5C975211D8}");
 
    bool injectState = false;
    const char* output = "Waiting for the game...\n";
    
    GUI.Initialize();
    while (GUI.Redraw()) {
        //GenerateBorder();
        GUI.CenteredText(6, "HWID:");
        GUI.CenteredText(8, "%s", hwProfileInfo.szHwProfileGuid);
        if (GUI.CenteredButton(10, 20, "Copy to clipboard"))
            ;//CopyToClipboard(hwProfileInfo.szHwProfileGuid);
 
        if (GUI.CenteredButton(14, 20, "Inject")) {
            if (isDev)
                ;//KillProcessByName("BlackCipher.aes");
            output = MMAP();
            injectState = true;
        }
 
        if (isDev) {
            if (GUI.CenteredButton(16, 20, "[Free debug inject]")) {
                //KillProcessByName("BlackCipher.aes");
                output = LoadLib();
                injectState = true;
            }
        }
 
        if(injectState)
            if (strstr(output, "Waiting for the game...\n"))
                output = "SoftON has been injected";
 
        GUI.CenteredText(20, "Message:");
        GUI.CenteredText(22, "%s", output);
 
        if (injectState) {
            Sleep(5000);
            GUI.Shutdown();
            exit(0);
        }
    }
    GUI.Shutdown();
 
    return 0;
}
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
08.01.2021, 17:09
Kroval, сильно же вас "прикурило"

Добавлено через 54 секунды
Kroval, сомневаюсь что автору такое понадобится. Тут человек не понимает, что консоль с мышью вообще плохо дружит, а точнее совсем не приспособлена под работу с ней, ибо консоль по сути лишь оболочка

Добавлено через 1 минуту
Kroval, ну и собственно человек не понял, что при нажатии в консоли консоль стоит и ждет что будет ввод и взял повторил эти же мои слова и спросил "почему консоль останавливается?"

Добавлено через 3 минуты
Цитата Сообщение от Роман72234 Посмотреть сообщение
Единица не появляется
Код перезапускать нужно после первой компиляции, ибо многие антивирусники новую программу начинают активно проверять. Первый раз порой не стартует свежий код. Вторая причина того, что единицы не появляются - нажали в консоли и консоль встала ожидая ввода. Больше мне вам сказать нечего, вы это осмыслите

Добавлено через 1 минуту
Цитата Сообщение от Роман72234 Посмотреть сообщение
мне нужно чтоб при нажатие левой кнопки мыши цикл не останавливался а что то писала
Ну так цикл что я вам дал и пишет "что-то" при нажатии кнопки. Единицы пишет пока кнопку держите (вне окошка, я повторяю). Ставите свой текст, делаете задержку какую вам надо и если удовлетворяет вашим требованиям - используете. Не нравится - модифицируйте как вам захочется, я не владелец кода и против не буду
1
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
08.01.2021, 17:12
Laborant666, что есть, то есть: вряд ли пригодится. Но наше дело простое - поделиться А "прикурило" меня тогда жутко)) Хорошо, что быстро пришло понимание, что я занимаюсь самым бесполезным занятием из всех возможных.
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
08.01.2021, 17:16
Kroval, особенно когда пришло понимание в приложении кнопка делается за две секунды в отличии от консоли?))
0
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
08.01.2021, 17:48
Laborant666, использовать Visual CPP я не хотел и не особо хочу, так как нормальная защита конечного приложения по сути невозможна из-за специфики Visual CPP. Я отдаю предпочтение графическим библиотекам. ИмГуи, например. Летом начинал пилить свою ГУИ-либу на GLFW и сделал даже пару контролов, но потом столько дел в один момент навалилось, что я до сих пор не могу к ней вернуться.
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
08.01.2021, 17:50
Kroval, а как приятно будет вспоминать потом то что писали, что б дописать) Уууу
0
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
08.01.2021, 17:54
Laborant666, скорее, буду начинать сначала. Много нового узнал за последние месяцы, так что лучше начать с чистого .cpp-файла Да и вообще: развиваясь, начинаю смотреть на свой ранешний код как на что-то совсем непотребное. не люблю к нему возвращаться.
0
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48
09.01.2021, 07:00  [ТС]
Во общем, как окончательный результат решение моего вопроса, на основание
переданного кода от Laborant666 написал свой следующей код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <Windows.h>
 
using namespace std;
void gotoxy(int x, int y) 
{
   COORD coord;
   coord.X = x;
   coord.Y = y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord) ;
} 
 
int main()
{
    setlocale(LC_ALL, "Russian");
CONSOLE_CURSOR_INFO curs = {0};
   curs.dwSize = sizeof(curs);
   curs.bVisible = FALSE;
   ::SetConsoleCursorInfo(::GetStdHandle(STD_OUTPUT_HANDLE), &curs);
    gotoxy(1,10);   
     cout << "Лев и прав кнопк отжаm    " << endl;
    while (1000)
    {
 
    
        if (GetKeyState(VK_LBUTTON ) <0  )
           {
            gotoxy(1,10);
cout << "Левая  кнопка  включена" << endl;}
             //Sleep(50);
     
       // Sleep(5);
        
        if (GetKeyState(VK_RBUTTON ) <0  )
        {
        gotoxy(1,10);
cout << "Правая кнопка  включена" << endl;}
 
}}
Этот код у меня работает нормально только за кулисами консоли. В начале появляется текст Лев и прав кнопк отжаm, нажимаю ЛКМ появлется Левая кнопка включена, при нажатие ПКМ - Правая кнопка включена

Добавлено через 4 минуты
Но все таки главный вопрос: почему нажатие ПКМ и ЛКМ в консоле, ЛКМ -останавливает весь цикл работу
кода, а ПКМ все возобнаявляет я так и не решил. Мне не понятно. Мне нужно чтоб при нажитие ПКМ и ЛКМ в консоле, также работали как и при нажатие за консолью. Пока ни как не получается. Может есть какие то настройки в редакторах DEVС++ и Visual C++

Добавлено через 12 минут
Я написал кучу программ на с++ на формах, но сейчас решил консоль в С++ поизучать
0
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
09.01.2021, 08:16
Роман72234, Так тоже останавливает? У меня вроде нет. Хотя у меня и не останавливало
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
void gotoxy(int x, int y) {
  static HANDLE std_out = GetStdHandle(STD_OUTPUT_HANDLE);
  COORD coord = { x, y };
  SetConsoleCursorPosition(std_out, coord);
}
 
void fill_line(const char* str) {
  const int line_width = 30; // took out of my head
  cout << str;
  for (int i(0); i < line_width - strlen(str); ++i)
    cout << ' ';
}
 
int main() {
  CONSOLE_CURSOR_INFO curs = { sizeof(curs),  FALSE };
  SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curs);
  while (true) {
    gotoxy(1, 10);
    if (GetKeyState(VK_LBUTTON) < 0)
      fill_line("LMB is pressed");
    else if (GetKeyState(VK_RBUTTON) < 0)
      fill_line("RMB is pressed");
    else
      fill_line("LMB and RMB are released ");
  }
}
0
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48
09.01.2021, 11:10  [ТС]
У меня этот код от Kroval работает только при нажатии мыши ЛКМ и ПКМ за границами консолью очень хорошо (все как надо).Но если курсор мыши подвести в черный консоль и нажать ПКМ то выходит RMB is pressed, отпускаю ПКМ
выходит LMB and RMB are released (пока все как надо), нажимаю ЛКМ надпись такая же - LMB and RMB are released (не выходит надпись LMB is pressed при нажатие в консоле ЛКМ, а мне надо чтоб выходило). Если выйти курсором мыши за консоль, то все надписи хорошо появляются при нажатии ЛКМ и ПКМ. Так вот нельзя-ли чтоб при нажатии мыши в консоле все хорошо выходило так, как за консолью. В этом проблема у меня. Заметил что при нажатии ЛКМ в консоле код останавливается,при нажатии ПКМ все возобнавляется. Нельзя ли эту команду как то отключить и перевести что при нажатии ЛКМ в консоле (а не за границами консоле)все таки появлялось надпись LMB is pressed, вместо остановки кода.

Добавлено через 1 минуту
У меня стоит Windows 10

Добавлено через 4 минуты
Если у Вас этот код работает при нажатии ПКМ т ЛКМ в консоле (все выходит как надо), а не за ее границами. То видимо какая то другая причина в настройках чего-то.

Добавлено через 45 минут
Еще заметил что в cmd.exe такая же ситуация ЛКМ оастанавливает а ПКМ возобновляет (то есть такая команда
стандартная для всех консольных приложений). Чувствую что я что то возможно не корректный вопрос по консолям задал.
Просто я хотел игру в консоли написать. Но будут такие проблемы. Для расчетной программы (рассчитать механику оборудования, станков, двигателей как набор формул введите значение, нажмите кнопку и получите результат) консоль пойдет. Но для игр это слишком наверно. Но мне надоело писать на формах.
Хочется и в консоле попробовать. Хотя капсулку в консоле на псевдографике я написал, но там управление с клавиатулы, а мне нужно с мышью. Если сообразили как решить эту проблему в консоле пожалуста напишите.
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
09.01.2021, 14:32
Цитата Сообщение от Роман72234 Посмотреть сообщение
Но все таки главный вопрос: почему нажатие ПКМ и ЛКМ в консоле, ЛКМ -останавливает весь цикл работу
кода, а ПКМ все возобнаявляет я так и не решил. Мне не понятно
Да елки-палки. Третий раз вам говорю - консоль при нажатии в ней начинает ждать от пользователя того, что вы решили что-то в консоль ввести. Вот и останавливается, ждёт ввода. Конец ввода определяется нажатием Enter и программа продолжает работу тогда

Добавлено через 2 минуты
Цитата Сообщение от Роман72234 Посмотреть сообщение
Просто я хотел игру в консоли написать
Пишите. Только делайте управление клавиатурой. Консоль это оболочка, которая заточена под ввод с клавиатуры. Под мышь она не заточена вовсе. Потому вот такие приколы с нажатием мышкой в консоли и происходят, консоль это воспринимает желанием сделать ввод информации и ждет. Как ещё понятнее то объяснить? Хотите игру, что б с мышью работала - пишите не консольное приложение, а приложение уже под виндовс, полноценное
0
5 / 5 / 2
Регистрация: 27.03.2018
Сообщений: 33
09.01.2021, 15:08
Цитата Сообщение от Роман72234 Посмотреть сообщение
Просто я хотел игру в консоли написать
Не советую. Будет намного проще написать игру, стилизованную под консольную. Конечно, это будет не "тру" консоль, но все эти страдания с консолью не оправданы от слова совсем.

А по поводу проблем с кодом даже без понятия. У меня и ваш код отлично работает, и мой.
0
3 / 3 / 0
Регистрация: 04.02.2015
Сообщений: 48
09.01.2021, 16:00  [ТС]
Но тем не менее у меня консоль в режиме выделения была. И ниже код теперь работает хоть в консоле так за ее пределами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
void gotoxy(int x, int y) {
  static HANDLE std_out = GetStdHandle(STD_OUTPUT_HANDLE);
  COORD coord = { x, y };
  SetConsoleCursorPosition(std_out, coord);
}
 
void fill_line(const char* str) {
  const int line_width = 30; // took out of my head
  cout << str;
  for (int i(0); i < line_width - strlen(str); ++i)
    cout << ' ';
}
 
int main() {
    DWORD prev_mode;
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hInput, &prev_mode);
    SetConsoleMode(hInput, prev_mode & ~ENABLE_QUICK_EDIT_MODE);
  CONSOLE_CURSOR_INFO curs = { sizeof(curs),  FALSE };
  SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curs);
  while (true) {
    gotoxy(1, 10);
    if (GetKeyState(VK_LBUTTON) < 0)
      fill_line("LMB is pressed");
    else if (GetKeyState(VK_RBUTTON) < 0)
      fill_line("RMB is pressed");
    else
      fill_line("LMB and RMB are released ");
  }
}
Добавлено через 3 минуты
Решение этой проблемы нашел на этом форуме.
Ну а теперь буду дальше изучать С++. У меня явно будут возникать всякие
вопросы, если сам не смогу решить, то буду просить помощи на этом форуме, для решение вопросов.
Спасибо!!!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2021, 16:00
Помогаю со студенческими работами здесь

Калькулятор: как обрабатывать нажатие кнопки мыши на одну из "кнопок"?
Здравствуйте. Нужна помощь! Задание калькулятор на assemlber (tasm). Будущие кнопочки(квадратики) я отрисовал, проверил в dosbox , все...

Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши выключить индикатор NumLock(+Звук),при нажатие право
Не могу решить подскожите кто знает.(Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши...

Программное нажатие на кнопку в игре не отрабатывает. Имитировать нажатие кнопок геймпада xbox 360
Добрый день! Хочу написать простенького бота, который бы помогал мне совершать некоторые простейшие операции в игре. Начал с самого...

Нажатие клавиш в консоле
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...

Нажатие клавиш в консоле
Доброго. Как возможно реализовать определенные действия при нажитии сочетания клавиш? Приложение консольное Добавлено через 20 минут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru