PowerShell을 활용한 마우스 자동 클릭 스크립트 구현

Windows 운영 체제에서 특정 작업을 자동화하기 위한 방법 중 하나는 마우스 클릭을 프로그램적으로 제어하는 것입니다. PowerShell 스크립트를 사용하면 지정된 화면 좌표로 마우스를 이동시키고 클릭하는 작업을 쉽게 자동화할 수 있습니다. 이 문서는 PowerShell 스크립트를 통해 이러한 기능을 구현하고 활용하는 방법을 안내합니다.

스크립트 기능 개요

이 스크립트는 Windows의 기본 라이브러리를 활용하여 마우스 커서를 지정된 화면 좌표로 이동시킨 후 좌클릭을 수행하는 기능을 제공합니다. 이를 통해 반복적인 수동 클릭 작업이나 간단한 GUI 상호작용을 자동화할 수 있습니다.

사전 준비

  • Windows 운영 체제가 설치된 PC
  • 마우스 자동 클릭 스크립트 파일 (예: auto-click-manager.ps1)
  • 클릭할 위치의 화면 좌표를 확인하는 도구 (예: Windows 기본 제공 캡처 도구 또는 Snipaste)

PowerShell 콘솔 실행

스크립트를 실행하려면 PowerShell 콘솔을 열어야 합니다.

  1. Windows 키 + X를 눌러 빠른 실행 메뉴를 엽니다.
  2. 메뉴에서 Windows PowerShell 또는 Windows PowerShell (관리자)를 선택하여 콘솔을 실행합니다.

스크립트 경로 설정

다운로드한 스크립트 파일이 있는 디렉터리로 PowerShell 콘솔의 경로를 변경해야 합니다.

  1. 스크립트 파일이 저장된 폴더의 경로를 복사합니다 (예: C:\Users\YourUser\Documents\Automouse).
  2. PowerShell 콘솔에서 다음 명령어를 실행하여 해당 경로로 이동합니다:
    cd "C:\Users\YourUser\Documents\Automouse"

필수 라이브러리 확인

이 스크립트는 System.Windows.Forms 라이브러리에 의존합니다. 다음 스크립트를 사용하여 시스템에 라이브러리가 제대로 로드되는지 확인할 수 있습니다.

check-forms-availability.ps1:

# 시스템 Windows Forms 라이브러리 가용성 확인 스크립트
try {
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show("System.Windows.Forms 모듈이 성공적으로 로드되었습니다.")
} catch {
    Write-Error "System.Windows.Forms 모듈을 로드할 수 없습니다. 시스템 환경을 확인하세요."
}

PowerShell 콘솔에서 .\check-forms-availability.ps1을 실행했을 때, 'System.Windows.Forms 모듈이 성공적으로 로드되었습니다.'라는 메시지 박스가 나타나면 정상적으로 작동할 준비가 된 것입니다.

스크립트 실행 정책 변경

만약 "이 시스템에서 스크립트를 실행할 수 없으므로..."와 같은 오류 메시지가 나타난다면, PowerShell의 실행 정책이 스크립트 실행을 제한하고 있기 때문입니다. 이 경우 다음 명령어를 사용하여 실행 정책을 변경할 수 있습니다:

Set-ExecutionPolicy RemoteSigned

프롬프트가 나타나면 Y를 입력하여 변경을 승인합니다. RemoteSigned 정책은 로컬에서 작성된 스크립트의 실행을 허용합니다.

예시: Steam 클라이언트 자동화

Steam 클라이언트에서 특정 게임을 순차적으로 클릭하여 정보를 확인하는 시나리오를 가정해 보겠습니다. 이 예시에서는 '게임 A', '게임 B', '게임 C'를 순서대로 클릭하는 작업을 자동화합니다.

클릭 좌표 식별

스크립트에 사용할 정확한 화면 좌표를 확인하는 것이 중요합니다. Windows에 내장된 캡처 도구 (Windows 키 + Shift + S)나 Snipaste 같은 외부 도구를 사용하여 마우스 커서 위치의 픽셀 좌표를 확인할 수 있습니다.

예를 들어, Steam 라이브러리에서 각 게임 항목의 중앙 좌표를 다음과 같이 식별했다고 가정합니다:

  • '게임 A': (121, 248)
  • '게임 B': (101, 426)
  • '게임 C': (101, 101)

스크립트 수정 및 실행

이제 auto-click-manager.ps1 파일을 열어 클릭할 좌표와 대기 시간을 설정합니다.

auto-click-manager.ps1:

Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public class WinMouseOps { 
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); 

    public const uint MOUSEEVENTF_MOVED = 0x0001; 
    public const uint MOUSEEVENTF_LEFT_DOWN = 0x0002; 
    public const uint MOUSEEVENTF_LEFT_UP = 0x0004; 
    public const uint MOUSEEVENTF_RIGHT_DOWN = 0x0008; 
    public const uint MOUSEEVENTF_RIGHT_UP = 0x0010; 
    public const uint MOUSEEVENTF_ABS = 0x8000; 
}
"@

function Perform-MouseClick ($coordX, $coordY) { 
    # 지정된 위치로 마우스 커서 이동
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($coordX, $coordY)
    
    # 좌클릭 수행 (눌렀다가 떼기)
    [WinMouseOps]::mouse_event([WinMouseOps]::MOUSEEVENTF_LEFT_DOWN, 0, 0, 0, 0)
    Start-Sleep -Milliseconds 50 
    [WinMouseOps]::mouse_event([WinMouseOps]::MOUSEEVENTF_LEFT_UP, 0, 0, 0, 0)
}

# 클릭할 위치와 각 클릭 사이의 대기 시간 목록 정의
$operationPoints = @( 
    @{ X = 121; Y = 248; DelaySec = 5 }, # '게임 A' 클릭 후 5초 대기
    @{ X = 101; Y = 426; DelaySec = 10 }, # '게임 B' 클릭 후 10초 대기
    @{ X = 101; Y = 101; DelaySec = 1 }, # '게임 C' 클릭 후 1초 대기 (테스트 목적)
    @{ X = 122; Y = 741; DelaySec = 10 } # 추가 예시
)

# 전체 반복 횟수 설정
$executionCycles = 1 

for ($cycle = 0; $cycle -lt $executionCycles; $cycle++) { 
    foreach ($pointData in $operationPoints) { 
        Write-Host "좌표 ($($pointData.X), $($pointData.Y)) 클릭 중 - 현재 $(\$cycle + 1)회 / 총 $($executionCycles)회"
        Perform-MouseClick -coordX $pointData.X -coordY $pointData.Y
        Start-Sleep -Seconds $pointData.DelaySec
    }
}

스크립트 파일 저장 후, PowerShell 콘솔에서 다음 명령어를 실행합니다:

.\auto-click-manager.ps1

콘솔에 클릭 진행 상황이 출력되며, 설정된 좌표에 따라 마우스 클릭 작업이 자동으로 수행됩니다.

스크립트 추가 설정

auto-click-manager.ps1 파일 내의 $operationPoints 배열을 수정하여 클릭할 좌표와 각 클릭 후 대기할 시간을 자유롭게 설정할 수 있습니다. 또한 $executionCycles 변수를 조정하여 전체 클릭 시퀀스를 반복할 횟수를 지정할 수 있습니다.

예를 들어, 특정 좌표를 여러 번 클릭하려면 다음과 같이 $operationPoints 배열에 해당 좌표를 여러 번 추가하고 짧은 대기 시간을 설정하면 됩니다.

# 클릭할 위치와 각 클릭 사이의 대기 시간 목록 (예시)
$operationPoints = @( 
    @{ X = 121; Y = 248; DelaySec = 5 }, 
    @{ X = 101; Y = 426; DelaySec = 10 },
    @{ X = 101; Y = 101; DelaySec = 1 }, # (101,101) 좌표를 1초 간격으로 3번 클릭
    @{ X = 101; Y = 101; DelaySec = 1 }, 
    @{ X = 101; Y = 101; DelaySec = 1 }, 
    @{ X = 122; Y = 741; DelaySec = 10 } 
)

# 전체 클릭 시퀀스를 무한히 반복하려면 아주 큰 숫자를 설정할 수 있습니다.
$executionCycles = 99999 

주의사항: 실행 정책 복원

스크립트 자동화 작업이 완료된 후에는 보안 강화를 위해 PowerShell 실행 정책을 원래대로 복원하는 것이 좋습니다. 다음 명령어를 사용하여 실행 정책을 Restricted로 되돌릴 수 있습니다.

Set-ExecutionPolicy Restricted

PowerShell 실행 정책에 대한 간략한 설명:

  • Restricted: PowerShell 스크립트 실행을 허용하지 않습니다.
  • AllSigned: 신뢰할 수 있는 게시자가 서명한 스크립트만 실행을 허용합니다.
  • RemoteSigned: 로컬 스크립트 실행을 허용하지만, 인터넷에서 다운로드한 스크립트는 신뢰할 수 있는 게시자의 서명이 필요합니다.
  • Unrestricted: 모든 스크립트 실행을 허용하지만, 인터넷에서 다운로드한 스크립트 실행 시 경고 메시지를 표시합니다.

태그: PowerShell automation MouseClick Windows Scripting

7월 18일 00:18에 게시됨