При моделировании входных событий с использованием заголовка Windows программа останавливается до тех пор, пока не будет дано прерывание вручную. - PullRequest
0 голосов
/ 04 января 2019

Вот программа, которую я создал, чтобы имитировать несколько входных событий, чтобы дать некоторое прерывание для другого процесса, используя заголовок Windows. Эта программа генерирует количество событий левого клика, события правого клика, события перемещения курсора мыши и события ввода с клавиатуры.

#pragma once

class InputEventGenerator
{

public:

InputEventGenerator();
~InputEventGenerator();
static void simulatekeyPressEvent(int keyPressCount);
static void simulateMouseLeftClick(int clickCount);
static void simulateMouseRightClick(int clickCount);
static void simulateMouseCurserMove();

private:

InputEventGenerator(const InputEventGenerator&) = delete;
InputEventGenerator operator=(const InputEventGenerator&) = delete;

};

Это файл .cpp

#include "InputEventGenerator.h"
#include <iostream>
#include <windows.h>
#include<atlbase.h>
#include <atlwin.h>

void InputEventGenerator::simulatekeyPressEvent(int keyPressCount)
{
    std::cout << "simulate key press event" << std::endl;
    INPUT ip;
    int KeyPress = keyPressCount;
    Sleep(3000);

    while (KeyPress > 0)
    {
        ip.type = INPUT_KEYBOARD;   // Set up a generic keyboard event.
        ip.ki.wScan = 0; // hardware scan code for key
        ip.ki.time = 0;
        ip.ki.dwExtraInfo = 0;
        ip.ki.wVk = 0x41; //Press the "A" key virtual-key code for the "a" key
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));
        ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release 
        //Release the "A" key
        SendInput(1, &ip, sizeof(INPUT));
        std::cout << "key press done" << std::endl;
        Sleep(3000);
        --KeyPress;
    }
}

void InputEventGenerator::simulateMouseLeftClick(int clickCount)
{
    int click_count = clickCount;
    std::cout << "Left click started" << std::endl;

    SetCursorPos(748, 294);
    while (click_count > 0)
    {
        INPUT input = { 0 };
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
        Sleep(200);

        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(input));
        Sleep(200);
        std::cout << "left mouse click  done" << std::endl;
        //::ZeroMemory(&input, sizeof(INPUT));
        click_count--;
    }
}

void InputEventGenerator::simulateMouseRightClick(int clickCount)
{
    int click_count = clickCount;
    std::cout << "Right click started" << std::endl;
    SetCursorPos(748, 294);

    while (click_count > 0)
    {
        INPUT input = { 0 };
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTDOWN;
        SendInput(1, &input, sizeof(INPUT));
        Sleep(200);

        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTUP;
        SendInput(1, &input, sizeof(input));
        std::cout << "right mouse click  done" << std::endl;
        Sleep(200);
        //::ZeroMemory(&input, sizeof(INPUT));
        click_count--;
    }
}

void InputEventGenerator::simulateMouseCurserMove()
{
    std::cout << "simulate mouse move" << std::endl;
    POINT p;
    SetCursorPos(0, 0);

    int loopCount = 100;
    while (loopCount > 0)
   {
        GetCursorPos(&p);
        p.x += 10;
        p.y += 10;
        INPUT input;
        input.type = INPUT_MOUSE;
        input.mi.mouseData = 0;
        input.mi.time = 0;
        input.mi.dx = p.x*(65536 / GetSystemMetrics(SM_CXSCREEN));
        input.mi.dy = p.y*(65536 / GetSystemMetrics(SM_CYSCREEN));
        input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK |MOUSEEVENTF_ABSOLUTE;
        SendInput(1, &input, sizeof(input));
        Sleep(500);
        --loopCount;
    }
 }

Это основная функция

#include "InputEventGenerator.h"
#include<atlbase.h>
#include <atlwin.h>

int main(int argc, char * argv[])
{
    InputEventGenerator::simulateMouseCurserMove();
    Sleep(20);
    InputEventGenerator::simulateMouseRightClick(10);
    Sleep(20);
    InputEventGenerator::simulatekeyPressEvent(5);
    Sleep(20);
    InputEventGenerator::simulateMouseLeftClick(10);
    Sleep(20);
    return 0;
}

Здесь, в основной функции при вызове simulateMouseLeftClick (), она останавливает программу и ждет, пока нажмете Enter. Я не понимаю процесс, стоящий за этим

...