a: マウスクリック(シンプル)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# 左クリックをシミュレートする関数
function Click-Left {
$mouseEvent = [System.Windows.Forms.MouseButtons]::Left
[System.Windows.Forms.Control]::MouseButtons -ne $mouseEvent
[System.Windows.Forms.Cursor]::Position = [System.Drawing.Point]::new($x, $y)
[System.Windows.Forms.Cursor]::Position
}
# マウスの座標を設定 (例: x=100, y=100)
$x = 100
$y = 100
# 左クリックを実行
Click-Left
b_マウスクリックしてスクショを繰り返す
# 必要なアセンブリをロード
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
Add-Type @"
using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public class User32_Helper {
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetWindowTextLength(IntPtr hWnd);
public static List<IntPtr> ListOpenWindows(string targetTitle) {
List<IntPtr> hWnds = new List<IntPtr>();
EnumWindows(delegate (IntPtr hWnd, IntPtr lParam) {
if (IsWindowVisible(hWnd)) {
int length = GetWindowTextLength(hWnd);
if (length > 0) {
StringBuilder windowText = new StringBuilder(length + 1);
GetWindowText(hWnd, windowText, windowText.Capacity);
string title = windowText.ToString();
if (title.Contains(targetTitle)) {
hWnds.Add(hWnd);
Console.WriteLine("HWND: " + hWnd.ToString() + ", Title: " + title);
}
}
}
return true;
}, IntPtr.Zero);
return hWnds;
}
}
"@
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class User32 {
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class MouseSimulator
{
[DllImport("user32.dll")]
public static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]
public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, IntPtr dwExtraInfo);
public const uint MOUSEEVENTF_LEFTDOWN = 0x02;
public const uint MOUSEEVENTF_LEFTUP = 0x04;
public const uint MOUSEEVENTF_MOVE = 0x0001;
public static void MoveMouse(int x, int y)
{
SetCursorPos(x, y);
mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, IntPtr.Zero);
}
public static void LeftClick()
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, IntPtr.Zero);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero);
}
}
"@
# 使用例: タイトルに "Calculator" が含まれるウィンドウのハンドルを抽出
$targetTitle = "****" #タイトル名をここに記載する
$hWnds = [User32_Helper]::ListOpenWindows($targetTitle)
Write-Host $hWnds
foreach ($hWnd in $hWnds) {
$intHwnd = $hWnd.ToInt32()
Write-Host "ウィンドウハンドル (整数): $intHwnd"
}
#if ($hWnd -ne [IntPtr]::Zero) {
# # ウィンドウを移動とサイズ変更
# [User32]::MoveWindow($intHwnd, $x, $y, $cx, $cy, $true)
#} else {
# Write-Host $hWnd + "ウィンドウが見つかりませんでした。"
#}
# スクリーンショットの範囲を指定
$startX = 187
$startX = 200 #グラフのみ
$startY = 150
$startY = 180 #グラフのみ
$width = 1920-187
$width = 1480-200 #グラフのみ
$height = 1039-150
$height = 540-180 #グラフのみ
# ビットマップオブジェクトを作成
$bitmap = New-Object System.Drawing.Bitmap($width, $height)
# グラフィックスオブジェクトを作成
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)
## スクリーンショットをファイルとして保存
#[User32]::SetForegroundWindow($hWnd)
#$graphics.CopyFromScreen($startX, $startY, 0, 0, [System.Drawing.Size]::new($width, $height),[System.Drawing.CopyPixelOperation]::SourceCopy)
#$filename = "C:\Users\10001146945\Desktop\ps1\bk\a_$((Get-Date).ToString('yyMMdd_HHmmss')).png"
#$bitmap.Save($filename, [System.Drawing.Imaging.ImageFormat]::png)
# ユーザーにループ回数を入力させる
$iterations = Read-Host "Enter the number of iterations"
# ウィンドウをアクティブにする
[User32]::SetForegroundWindow($hWnd)
# 入力が数値であるかを確認
if ($iterations -match '^\d+$') {
$iterations = [int]$iterations
# forループを使用して特定回数繰り返す
for ($i = 0; $i -lt $iterations; $i++) {
Write-Output "This is iteration number $i"
# ウィンドウをアクティブにする
[User32]::SetForegroundWindow($hWnd)
# スクリーン全体をキャプチャ
$graphics.CopyFromScreen($startX, $startY, 0, 0, [System.Drawing.Size]::new($width, $height),[System.Drawing.CopyPixelOperation]::SourceCopy)
# スクリーンショットをファイルとして保存
$filename = "C:\Users\10001146945\Desktop\ps1\bk\a_$((Get-Date).ToString('yyMMdd_HHmmss')).png"
$bitmap.Save($filename, [System.Drawing.Imaging.ImageFormat]::png)
Start-Sleep -Milliseconds 1800 # n秒待機
# 左クリックする関数
$x = 1470
$y = 970
[MouseSimulator]::MoveMouse($x, $y)
[MouseSimulator]::LeftClick()
$x = 300
$y = 650
[MouseSimulator]::MoveMouse($x, $y)
[MouseSimulator]::LeftClick()
# Enterキーを送信_
#[System.Windows.Forms.SendKeys]::SendWait("{DOWN}")
Start-Sleep -Milliseconds 500 # n秒待機
}
} else {
Write-Output "Please enter a valid number."
}
# リソースを解放
$graphics.Dispose()
$bitmap.Dispose()
Write-Host "スクリーンショットが 'screenshot.png' に保存されました。"
コメント