DT1-Remote 버튼 자동화 프로그램 (응용 프로그램(.exe 실행파일) 실행 후 버튼 클릭)
- 최초 작성일: 2023년 4월 4일 (화)
목차
[TOC]
내용
이 C++ 코드는 “DT1-Remote.exe” 프로세스를 찾아 실행하고, 해당 프로그램의 창을 찾는 작업을 수행한다.
코드 설명
- ‘IsProcessRunning’ 함수: 이 함수는 주어진 프로세스 이름을 사용하여 프로세스가 실행 중인지 확인한다. 프로세스 이름을 비교하기 위해 ‘_wcsicmp’ 함수를 사용하며, 프로세스가 실행 중이면 ‘true’ 를 반환한다.
- ‘main’ 함수: 프로그램의 주 실행 부분
- ‘IsProcessRunning’ 함수를 사용하여 “DT1-Remote.exe” 프로세스가 실행 중인지 확인한다.
- 프로세스가 실행 중이 아닐 경우, ‘system’ 함수를 사용하여 “DT1-Remote.exe” 프로그램을 실행한다. 실행에 실패하면 에러 메시지를 출력하고 종료한다.
- “DT1-Remote.exe” 프로그램이 실행되고 나서 창이 로드되는 시간을 주기 위해 3초 동안 대기한다.
- ‘FindWindow’ 함수를 사용하여 “DT1-Remote” 창을 찾는다. 창을 찾지 못하면 에러 메시지를 출력하고 종료한다.
이 코드는 “DT1-Remote.exe” 프로세스를 실행하고 해당 프로그램의 창을 찾는 작업을 수행하지만, “Target on” 버튼을 찾고 작동시키는 부분은 포함되어 있지 않습니다. 이전에 제공한 코드에서 이 부분을 추가하면 완전한 기능을 구현할 수 있습니다.
코드 1
#include <iostream>
#include <Windows.h>
#include <Shellapi.h>
int main() {
// DT1-Remote.exe를 실행
int result = system("\"E:\\Program Files (x86)\\RFbeam\\DT1-Remote\\DT1-Remote.exe\"");
if (result != 0) {
std::cerr << "Error executing DT1-Remote.exe" << std::endl;
return 1;
}
// 일정 시간을 기다린 후, "Target on" 버튼이 있는 창을 찾음
Sleep(3000);
HWND hwnd = FindWindow(NULL, "DT1-Remote");
if (!hwnd) {
std::cerr << "Unable to find DT1-Remote window" << std::endl;
return 1;
}
// "Target on" 버튼 찾음
const int TARGET_ON_BUTTON_ID = 1001; // 버튼의 실제 ID
HWND hwndButton = GetDlgItem(hwnd, TARGET_ON_BUTTON_ID);
if (!hwndButton) {
std::cerr << "Unable to find Target on button" << std::endl;
return 1;
}
// "Target on" 버튼을 ON 상태로 변경
SendMessage(hwndButton, BM_CLICK, 0, 0);
return 0;
}
코드 2
DT1-Remote.exe 파일이 이미 실행 중인지 체크하는거 추가
#include <iostream>
#include <Windows.h>
#include <Shellapi.h>
#include <TlHelp32.h>
bool IsProcessRunning(const char* processName) {
bool isRunning = false;
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry)) {
do {
if (!_stricmp(entry.szExeFile, processName)) {
isRunning = true;
break;
}
} while (Process32Next(snapshot, &entry));
}
CloseHandle(snapshot);
return isRunning;
}
int main() {
bool isRunning = IsProcessRunning("DT1-Remote.exe");
if (!isRunning) {
int result = system("\"E:\\Program Files (x86)\\RFbeam\\DT1-Remote\\DT1-Remote.exe\"");
if (result != 0) {
std::cerr << "Error executing DT1-Remote.exe" << std::endl;
return 1;
}
}
Sleep(3000);
HWND hwnd = FindWindow(NULL, "DT1-Remote");
if (!hwnd) {
std::cerr << "Unable to find DT1-Remote window" << std::endl;
return 1;
}
// 창의 제목을 가져옵니다.
char windowTitle[512];
GetWindowTextA(hwnd, windowTitle, 512);
// "Target on" 버튼을 찾습니다.
HWND hwndButton = FindWindowEx(hwnd, NULL, "Button", "Target on");
if (!hwndButton) {
std::cerr << "Unable to find Target on button" << std::endl;
return 1;
}
// 버튼의 현재 상태를 가져옵니다.
LRESULT state = SendMessage(hwndButton, BM_GETSTATE, 0, 0);
// 버튼이 OFF 상태일 때만 ON으로 변경합니다.
if (!(state & BST_CHECKED)) {
SendMessage(hwndButton, BM_CLICK, 0, 0);
}
return 0;
}
그런데, 이미 프로그램이 실행중이면 “Target ON” 버튼이 OFF 상태여도 ON으로 변경하지 못함…