Программа уходит в бесконечный цикл, хотя не должна

Есть вот такой код на с++:

#include <Windows.h>

void m_click(short int times)
{
    for (int i = 0; i < times; i++)
    {
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        Sleep(25);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }
}

void main()
{
    for (;; Sleep(25))
        if (GetAsyncKeyState(VK_LBUTTON))
            m_click(2);
}

Как вы понимаете программа должна считывать физическое нажатие на кнопку мыши(именно физическое) и после этого посылать 2 нажатия, но программа входит в бесконечный цикл и начинает бесконечно кликать, предположительно из-за того, что она считывает те же нажатия, что и посылает. Подскажите пожалуйста, как это можно исправить.

P. s. я имею ввиду не основной цикл for() в функции main(), а тот который вызывается из-за функции m_click(), и условия if (GetAsyncKeyState(VK_LBUTTON))


Ответы (2 шт):

Автор решения: Harry

Да сделайте простейший вывод

void m_click(short int times)
{
    cout << "Start" << endl;
    for (int i = 0; i < times; i++)
    {
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        Sleep(25);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }
    cout << "Stop" << endl;
}

и убедитесь, что цикл не бесконечен! просто ваш цикл в main перехватывает эти ваши нажатия из цикла...

Если вы поясните, как вы бы хотели, чтоб вела себя программа - можно будет обсуждать пути решения. Сейчас же только можно говорить, что все отрабатывает корректно...

→ Ссылка
Автор решения: n 1 k z z z

Я решил поставленную задачу. Все решилось путем добавления bool-переменной, которая определяла "мои" нажатия или не "мои".

#include <Windows.h>

void m_click(short int times)
{
    for (int i = 0; i < times; i++)
    {
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        Sleep(25);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

}

bool is_own = true;

void main()
{
    for (;; Sleep(25))
        if (GetAsyncKeyState(VK_LBUTTON))
            if (is_own)
            {
                m_click(2);
                is_own = false;
            }
            else is_own = true;
}
→ Ссылка