Функции мыши C ++ не отвечают, Попытка создать симулятор щелчка - PullRequest
0 голосов
/ 29 апреля 2020
#include <Windows.h>
#include <iostream>
#include <conio.h>

//void MouseRetracer(POINT mousePos, int noOfSaves, int delay)
//{
//  
//}

int main(int argc, char* argv[])
{
    std::cout << "Enter delay between 2 clicks... ";
    int delay;
    std::cin >> delay;
    std::cout << "Hover the mouse to the desired location and press 'k'...\n";
    //std::cin.get();
    std::cout << "Press ENTER to start taking inputs!!!" << std::endl;

    bool quit = true;
    int noOfSaves = 0;
    POINT mousePos[100];

    while (quit)
    {
        if (_kbhit())
        {
            char kbKey = _getch();
            if (kbKey == 'k')
            {
                GetCursorPos(&mousePos[noOfSaves]);
                std::cout << noOfSaves + 1 << " positions saved...\n";
                noOfSaves++;
            }
            if (kbKey == 'q')
                quit = false;
        }
    }

    std::cout << "DO NOT move mouse now!" << std::endl;
    //MouseRetracer(mousePos, noOfSaves, delay);
    for (int i = 0; i < noOfSaves; i++)
    {
        //std::cout << mousePos[i].x << '\t';
        Sleep(delay);

        mouse_event(MOUSEEVENTF_LEFTDOWN, mousePos[i].x, mousePos[i].y, NULL, NULL);
        mouse_event(MOUSEEVENTF_LEFTUP, mousePos[i].x, mousePos[i].y, NULL, NULL);

        std::cout << i + 1 << "th save clicked!\n";
    }

    /*std::cout << "Do this again? (y/n)\n";
    char repeat;
    std::cin >> repeat;

    switch (repeat)
    {
    case 'y':
        system("cls");
        break;
    case 'Y':
        system("cls");
        break;
    default:
        return 0;
    }*/

    return 0;
}

Приведенный выше код может правильно принимать входные данные, т. Е. Он создает POINT struct и сохраняет данные mousePos[0], mousePos[1], et c. правильно (я проверил с помощью отладчика Visual Studio 2019), но он не может имитировать щелчки, используя mouse_event(). Там нет ошибок или предупреждений. Кажется, проблема в mouse_event(), хотя она отлично работает в других программах, где используется POINT mousePos;. Использование POINT mousePos[100] кажется проблематичным.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2020

Используйте SetCursorPos для установки положения курсора, а затем используйте mouse_event для отправки события нажатия кнопки мыши. Ниже приведен рабочий код для меня. Вы можете попробовать.

for (int i = 0; i < noOfSaves; i++)
{
    Sleep(delay);

    SetCursorPos(mousePos[i].x, mousePos[i].y);

    mouse_event(MOUSEEVENTF_LEFTDOWN, mousePos[i].x, mousePos[i].y, NULL, NULL);
    mouse_event(MOUSEEVENTF_LEFTUP, mousePos[i].x, mousePos[i].y, NULL, NULL);

    std::cout << i + 1 << "th save clicked!\n";
}

Примечание. Рекомендуется использовать SendInput вместо mouse_event, поскольку эта функция была заменена.

...