제로로부터 만드는 RPA 그 1의 4 마우스 동작 기록편(재생)

소개



그 중 3 에서는 마우스의 움직임을 기록하는 기능을 만들었습니다. 이번에는, 그 기록한 동작을 재현하는 처리를 만듭니다.

환경



내가 사용하는 환경은 다음과 같습니다. 환경이 다른 경우에는 적절히 읽어 주십시오.
  • Windows 10 pro
  • Visual Studio 2019 Community Edition

  • 이번에 할 일


  • 화면에 "재생"버튼 추가
  • 파일로드
  • 기록 된 각 마우스 조작에 대해 마우스를 작동시킵니다.

    버튼 추가



    녹화 버튼을 추가했을 때와 마찬가지로 재생 버튼을 대화 상자에 추가합니다.



    그런 다음 대화 상자의 콜백 함수에 재생 버튼 클릭 메시지 처리를 추가합니다.

    DaphRPApp.cpp
        case WM_COMMAND:
            switch (LOWORD(wp)) 
            {
            case IDC_REC_BTN:
                StartMouseHook(hDlgWnd);
                return FALSE;
            case IDC_PLAY_BTN:
                return FALSE;
            default:
                return FALSE;
            }
    

    버튼의 ID가 IDC_PLAY_BTN이므로 버튼의 처리를 WM_COMMAND의 처리에 추가합니다.

    파일 로드



    녹화 중에 저장한 마우스 이벤트 로그 파일을 읽습니다.

    DaphRPApp.cpp
        std::ifstream fin;
        fin.open(L"rec.log", std::ios::in);
    
    ifstream 를 사용하여 파일을 읽습니다.
    그런 다음 파일을 한 줄씩 로드합니다.

    DaphRPApp.cpp
        while (true)
        {
            char line[128] = { 0 };
            fin >> line;
            if (line[0] == '\0')
                continue;
        }
    
    >> 를 사용하여 한 줄씩 로드합니다. 공행이 오면 처리를 종료하고 있습니다.
    그런 다음 파일의 내용을 구문 분석합니다.
    파일은 CSV 형식으로 다음 형식으로 저장됩니다.メッセージ, X座標, Y座標, タイムスタンプ따라서 strtok_s 를 사용하여 쉼표로 구분된 문자열을 각각 가져옵니다.
    취득한 후에는, 각각의 캐릭터 라인을 수치로 변환해 보관 유지합니다.

    DaphRPApp.cpp
            char* ctx = nullptr;
    
            char* token = strtok_s(line, ",", &ctx);
            if (token == nullptr)
                continue;
    
            int msg = atoi(token);
    
            token = strtok_s(nullptr, ",", &ctx);
            if (token == nullptr)
                continue;
    
            int x = atoi(token);
    
            token = strtok_s(nullptr, ",", &ctx);
            if (token == nullptr)
                continue;
    
            int y = atoi(token);
    
            token = strtok_s(nullptr, ",", &ctx);
            if (token == nullptr)
                continue;
    
            int timestamp = atoi(token);
    

    이것으로 저장된 마우스 메시지의 분석이 완료됩니다.

    마우스 동작



    분석된 값을 사용하여 마우스를 움직입니다.
    마우스를 움직이려면 SendInput 함수를 사용합니다.

    SendInput
    UINT WINAPI SendInput(
      _In_ UINT    nInputs,
      _In_ LPINPUT pInputs,
      _In_ int     cbSize
    );
    
    SendInput 는 키보드나 마우스를 프로그래밍 방식으로 조작하기 위한 함수입니다.
    아래와 같이 해석한 값을 설정해, SendInput 를 호출합니다.

    SendInput
            int time = prevtime == 0 ? 0 : timestamp - prevtime;
            if (time < 0)
                time = 0;
    
            INPUT inp[1] = { 0 };
            inp[0].type = INPUT_MOUSE;
            inp[0].mi.time = 0;
            inp[0].mi.dwExtraInfo = 0;
            inp[0].mi.dx = x * (65535 / GetSystemMetrics(SM_CXSCREEN));
            inp[0].mi.dy = y * (65535 / GetSystemMetrics(SM_CYSCREEN));
            inp[0].mi.mouseData = 0;
            inp[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
    
            switch (msg)
            {
            case WM_LBUTTONDOWN:
                inp[0].mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;
                break;
            case WM_LBUTTONUP:
                inp[0].mi.dwFlags |= MOUSEEVENTF_LEFTUP;
                break;
            case WM_MOUSEMOVE:
                break;
            case WM_MOUSEWHEEL:
                break;
            case WM_MOUSEHWHEEL:
                break;
            case WM_RBUTTONDOWN:
                inp[0].mi.dwFlags |= MOUSEEVENTF_RIGHTUP;
                break;
            case WM_RBUTTONUP:
                inp[0].mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN;
                break;
            }
    
            Sleep(time);
            SendInput(1, inp, sizeof(INPUT));
    
    INPUT 구조체에 INPUT_MOUSE를 지정하여 마우스가 작동하도록 지정합니다.
    그 후에는 x와 y를 설정합니다. 이 값은 화면의 너비와 높이를 65535로 표시해야하므로 65535를 화면의 너비와 높이로 나눈 값을 곱하여 계산합니다.

    휠의 동작은 지금까지 미대응이므로, 처리를 넣고 있지 않습니다. 여가 시간을 찾아 확장합니다.

    움직임을 보자.



    동영상이라면, 그냥 그림을 그리는 만큼 보일지도 모르지만, 기록한 것을 재생한 동영상입니다. 사실이에요~.

    마우스 동작을 기록 재생할 수 있는 RPA를 만들어 그림을 기록하여 재생해 보았다. htps // t. 코/0게 dxJ3Y6K via @YouTube — teamm (@teamm89201677) 10월 17, 2019


    계속



    이제 마우스 동작을 기록하고 재생할 수 있습니다. UWSC에서 말하는 저레벨 기록입니다.

    키보드의 기록 재생은, 똑같이 훅 해 기록해 재생하면 되므로, 간단하게 만들 수 있다고 생각합니다.

    만약 수요가 있으면 쓰므로, 코멘트해 주세요.



    다음 번은 OpenCV를 사용한 이미지 지정에 의한 항목 클릭 구현입니다.

    htps : // 이 m / 쉬움 _ 마츠오 / ms / 1 d10 0379570 네 f96d0



    이전 기사는 다음과 같습니다.



    그 1의 1

    htps : // 이 m / 쉬움 _ 마츠오 / ms / b1 56, d06c6, 7843d

    그 1의 2

    htps : // 코 m / 쉬어 _ 마츠오 / ms / 아 1d294f09 아 c21 9508b6

    그 1의 3

    htps : // 코 m / 쉬어 _ 마츠오 / ms / 14 987 A 162936 f7 A 1 Ae


  • 좋은 웹페이지 즐겨찾기