제로로부터 만드는 RPA 그 1의 4 마우스 동작 기록편(재생)
소개
그 중 3 에서는 마우스의 움직임을 기록하는 기능을 만들었습니다. 이번에는, 그 기록한 동작을 재현하는 처리를 만듭니다.
환경
내가 사용하는 환경은 다음과 같습니다. 환경이 다른 경우에는 적절히 읽어 주십시오.
내가 사용하는 환경은 다음과 같습니다. 환경이 다른 경우에는 적절히 읽어 주십시오.
이번에 할 일
버튼 추가
녹화 버튼을 추가했을 때와 마찬가지로 재생 버튼을 대화 상자에 추가합니다.
그런 다음 대화 상자의 콜백 함수에 재생 버튼 클릭 메시지 처리를 추가합니다.
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
함수를 사용합니다.
SendInputUINT 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
계속
case WM_COMMAND:
switch (LOWORD(wp))
{
case IDC_REC_BTN:
StartMouseHook(hDlgWnd);
return FALSE;
case IDC_PLAY_BTN:
return FALSE;
default:
return FALSE;
}
녹화 중에 저장한 마우스 이벤트 로그 파일을 읽습니다.
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
함수를 사용합니다.
SendInputUINT 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
계속
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
);
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));
동영상이라면, 그냥 그림을 그리는 만큼 보일지도 모르지만, 기록한 것을 재생한 동영상입니다. 사실이에요~.
마우스 동작을 기록 재생할 수 있는 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
Reference
이 문제에 관하여(제로로부터 만드는 RPA 그 1의 4 마우스 동작 기록편(재생)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yasunari_matsuo/items/8a528066cda871c345d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)