src/senko/Robot.js
/**
* The script is part of SenkoWSH.
*
* AUTHOR:
* natade (http://twitter.com/natadea)
*
* LICENSE:
* The MIT license https://opensource.org/licenses/MIT
*/
import System from "./System.js";
/**
* 大きさ情報
* @typedef {Object} WSHRobotRect
* @property {number} x 座標x
* @property {number} y 座標y
* @property {number} width 横幅
* @property {number} height 縦幅
*/
/**
* 位置情報
* @typedef {Object} WSHRobotPosition
* @property {number} x 座標x
* @property {number} y 座標y
*/
/**
* 仮想キーコード
* @typedef {Object} VirtualKeyCode
* @property {number} code
*/
/**
* 仮想キーコード一覧
* @typedef {Object} VirtualKeyCodes
* @property {VirtualKeyCode} VK_LBUTTON
* @property {VirtualKeyCode} VK_RBUTTON
* @property {VirtualKeyCode} VK_CANCEL
* @property {VirtualKeyCode} VK_MBUTTON
* @property {VirtualKeyCode} VK_XBUTTON1
* @property {VirtualKeyCode} VK_XBUTTON2
* @property {VirtualKeyCode} VK_BACK
* @property {VirtualKeyCode} VK_TAB
* @property {VirtualKeyCode} VK_CLEAR
* @property {VirtualKeyCode} VK_RETURN
* @property {VirtualKeyCode} VK_SHIFT
* @property {VirtualKeyCode} VK_CONTROL
* @property {VirtualKeyCode} VK_MENU
* @property {VirtualKeyCode} VK_PAUSE
* @property {VirtualKeyCode} VK_CAPITAL
* @property {VirtualKeyCode} VK_KANA
* @property {VirtualKeyCode} VK_HANGEUL
* @property {VirtualKeyCode} VK_HANGUL
* @property {VirtualKeyCode} VK_JUNJA
* @property {VirtualKeyCode} VK_FINAL
* @property {VirtualKeyCode} VK_HANJA
* @property {VirtualKeyCode} VK_KANJI
* @property {VirtualKeyCode} VK_ESCAPE
* @property {VirtualKeyCode} VK_CONVERT
* @property {VirtualKeyCode} VK_NONCONVERT
* @property {VirtualKeyCode} VK_ACCEPT
* @property {VirtualKeyCode} VK_MODECHANGE
* @property {VirtualKeyCode} VK_SPACE
* @property {VirtualKeyCode} VK_PRIOR
* @property {VirtualKeyCode} VK_NEXT
* @property {VirtualKeyCode} VK_END
* @property {VirtualKeyCode} VK_HOME
* @property {VirtualKeyCode} VK_LEFT
* @property {VirtualKeyCode} VK_UP
* @property {VirtualKeyCode} VK_RIGHT
* @property {VirtualKeyCode} VK_DOWN
* @property {VirtualKeyCode} VK_SELECT
* @property {VirtualKeyCode} VK_PRINT
* @property {VirtualKeyCode} VK_EXECUTE
* @property {VirtualKeyCode} VK_SNAPSHOT
* @property {VirtualKeyCode} VK_INSERT
* @property {VirtualKeyCode} VK_DELETE
* @property {VirtualKeyCode} VK_HELP
* @property {VirtualKeyCode} VK_0
* @property {VirtualKeyCode} VK_1
* @property {VirtualKeyCode} VK_2
* @property {VirtualKeyCode} VK_3
* @property {VirtualKeyCode} VK_4
* @property {VirtualKeyCode} VK_5
* @property {VirtualKeyCode} VK_6
* @property {VirtualKeyCode} VK_7
* @property {VirtualKeyCode} VK_8
* @property {VirtualKeyCode} VK_9
* @property {VirtualKeyCode} VK_A
* @property {VirtualKeyCode} VK_B
* @property {VirtualKeyCode} VK_C
* @property {VirtualKeyCode} VK_D
* @property {VirtualKeyCode} VK_E
* @property {VirtualKeyCode} VK_F
* @property {VirtualKeyCode} VK_G
* @property {VirtualKeyCode} VK_H
* @property {VirtualKeyCode} VK_I
* @property {VirtualKeyCode} VK_J
* @property {VirtualKeyCode} VK_K
* @property {VirtualKeyCode} VK_L
* @property {VirtualKeyCode} VK_M
* @property {VirtualKeyCode} VK_N
* @property {VirtualKeyCode} VK_O
* @property {VirtualKeyCode} VK_P
* @property {VirtualKeyCode} VK_Q
* @property {VirtualKeyCode} VK_R
* @property {VirtualKeyCode} VK_S
* @property {VirtualKeyCode} VK_T
* @property {VirtualKeyCode} VK_U
* @property {VirtualKeyCode} VK_V
* @property {VirtualKeyCode} VK_W
* @property {VirtualKeyCode} VK_X
* @property {VirtualKeyCode} VK_Y
* @property {VirtualKeyCode} VK_Z
* @property {VirtualKeyCode} VK_LWIN
* @property {VirtualKeyCode} VK_RWIN
* @property {VirtualKeyCode} VK_APPS
* @property {VirtualKeyCode} VK_SLEEP
* @property {VirtualKeyCode} VK_NUMPAD0
* @property {VirtualKeyCode} VK_NUMPAD1
* @property {VirtualKeyCode} VK_NUMPAD2
* @property {VirtualKeyCode} VK_NUMPAD3
* @property {VirtualKeyCode} VK_NUMPAD4
* @property {VirtualKeyCode} VK_NUMPAD5
* @property {VirtualKeyCode} VK_NUMPAD6
* @property {VirtualKeyCode} VK_NUMPAD7
* @property {VirtualKeyCode} VK_NUMPAD8
* @property {VirtualKeyCode} VK_NUMPAD9
* @property {VirtualKeyCode} VK_MULTIPLY
* @property {VirtualKeyCode} VK_ADD
* @property {VirtualKeyCode} VK_SEPARATOR
* @property {VirtualKeyCode} VK_SUBTRACT
* @property {VirtualKeyCode} VK_DECIMAL
* @property {VirtualKeyCode} VK_DIVIDE
* @property {VirtualKeyCode} VK_F1
* @property {VirtualKeyCode} VK_F2
* @property {VirtualKeyCode} VK_F3
* @property {VirtualKeyCode} VK_F4
* @property {VirtualKeyCode} VK_F5
* @property {VirtualKeyCode} VK_F6
* @property {VirtualKeyCode} VK_F7
* @property {VirtualKeyCode} VK_F8
* @property {VirtualKeyCode} VK_F9
* @property {VirtualKeyCode} VK_F10
* @property {VirtualKeyCode} VK_F11
* @property {VirtualKeyCode} VK_F12
* @property {VirtualKeyCode} VK_F13
* @property {VirtualKeyCode} VK_F14
* @property {VirtualKeyCode} VK_F15
* @property {VirtualKeyCode} VK_F16
* @property {VirtualKeyCode} VK_F17
* @property {VirtualKeyCode} VK_F18
* @property {VirtualKeyCode} VK_F19
* @property {VirtualKeyCode} VK_F20
* @property {VirtualKeyCode} VK_F21
* @property {VirtualKeyCode} VK_F22
* @property {VirtualKeyCode} VK_F23
* @property {VirtualKeyCode} VK_F24
* @property {VirtualKeyCode} VK_NUMLOCK
* @property {VirtualKeyCode} VK_SCROLL
* @property {VirtualKeyCode} VK_LSHIFT
* @property {VirtualKeyCode} VK_RSHIFT
* @property {VirtualKeyCode} VK_LCONTROL
* @property {VirtualKeyCode} VK_RCONTROL
* @property {VirtualKeyCode} VK_LMENU
* @property {VirtualKeyCode} VK_RMENU
* @property {VirtualKeyCode} VK_BROWSER_BACK
* @property {VirtualKeyCode} VK_BROWSER_FORWARD
* @property {VirtualKeyCode} VK_BROWSER_REFRESH
* @property {VirtualKeyCode} VK_BROWSER_STOP
* @property {VirtualKeyCode} VK_BROWSER_SEARCH
* @property {VirtualKeyCode} VK_BROWSER_FAVORITES
* @property {VirtualKeyCode} VK_BROWSER_HOME
* @property {VirtualKeyCode} VK_VOLUME_MUTE
* @property {VirtualKeyCode} VK_VOLUME_DOWN
* @property {VirtualKeyCode} VK_VOLUME_UP
* @property {VirtualKeyCode} VK_MEDIA_NEXT_TRACK
* @property {VirtualKeyCode} VK_MEDIA_PREV_TRACK
* @property {VirtualKeyCode} VK_MEDIA_STOP
* @property {VirtualKeyCode} VK_MEDIA_PLAY_PAUSE
* @property {VirtualKeyCode} VK_LAUNCH_MAIL
* @property {VirtualKeyCode} VK_LAUNCH_MEDIA_SELECT
* @property {VirtualKeyCode} VK_LAUNCH_APP1
* @property {VirtualKeyCode} VK_LAUNCH_APP2
* @property {VirtualKeyCode} VK_OEM_1
* @property {VirtualKeyCode} VK_OEM_PLUS
* @property {VirtualKeyCode} VK_OEM_COMMA
* @property {VirtualKeyCode} VK_OEM_MINUS
* @property {VirtualKeyCode} VK_OEM_PERIOD
* @property {VirtualKeyCode} VK_OEM_2
* @property {VirtualKeyCode} VK_OEM_3
* @property {VirtualKeyCode} VK_OEM_4
* @property {VirtualKeyCode} VK_OEM_5
* @property {VirtualKeyCode} VK_OEM_6
* @property {VirtualKeyCode} VK_OEM_7
* @property {VirtualKeyCode} VK_OEM_8
* @property {VirtualKeyCode} VK_PROCESSKEY
* @property {VirtualKeyCode} VK_ATTN
* @property {VirtualKeyCode} VK_CRSEL
* @property {VirtualKeyCode} VK_EXSEL
* @property {VirtualKeyCode} VK_EREOF
* @property {VirtualKeyCode} VK_PLAY
* @property {VirtualKeyCode} VK_ZOOM
* @property {VirtualKeyCode} VK_NONAME
* @property {VirtualKeyCode} VK_PA1
* @property {VirtualKeyCode} VK_OEM_CLEAR
*/
/**
* マウスイベント用コード
* @typedef {Object} MouseEventFCodes
* @property {number} MOUSEEVENTF_ABSOLUTE
* @property {number} MOUSEEVENTF_MOVE
* @property {number} MOUSEEVENTF_LEFTDOWN
* @property {number} MOUSEEVENTF_LEFTUP
* @property {number} MOUSEEVENTF_RIGHTDOWN
* @property {number} MOUSEEVENTF_RIGHTUP
* @property {number} MOUSEEVENTF_MIDDLEDOWN
* @property {number} MOUSEEVENTF_MIDDLEUP
* @property {number} MOUSEEVENTF_WHEEL
* @property {number} MOUSEEVENTF_XDOWN
* @property {number} MOUSEEVENTF_XUP
*/
/**
* マウスイベント用コード一覧
* @type {MouseEventFCodes}
*/
const MOUSEEVENTF_DATA = {
MOUSEEVENTF_ABSOLUTE :0x8000,
MOUSEEVENTF_MOVE :0x0001,
MOUSEEVENTF_LEFTDOWN :0x0002,
MOUSEEVENTF_LEFTUP :0x0004,
MOUSEEVENTF_RIGHTDOWN :0x0008,
MOUSEEVENTF_RIGHTUP :0x0010,
MOUSEEVENTF_MIDDLEDOWN :0x0020,
MOUSEEVENTF_MIDDLEUP :0x0040,
MOUSEEVENTF_WHEEL :0x0800,
MOUSEEVENTF_XDOWN :0x0080,
MOUSEEVENTF_XUP :0x0100
};
/**
* キーイベント発生時のオプション
* @typedef {Object} KeyEventOption
* @property {number} [count_max=1] 繰り返す回数
* @property {boolean} [is_not_pushed=false] 押さない
* @property {boolean} [is_not_released=false] 離さない
* @property {number} [push_time_sec=0] 押下時間
* @property {boolean} [is_pressed_shift=false] `+ Shift`
* @property {boolean} [is_pressed_alt=false] `+ Alt`
* @property {boolean} [is_pressed_ctrl=false] `+ Ctrl`
*/
/**
* マウスイベント発生時のオプション
* @typedef {Object} MouseEventOption
* @property {number} [count_max=1] 繰り返す回数
* @property {boolean} [is_not_pushed=false] 押さない
* @property {boolean} [is_not_released=false] 離さない
* @property {number} [push_time_sec=0] 押下時間
*/
/**
* ハンドルを取得する際に必要なデータ
* @typedef {Object} RobotGetHandleData
* @property {string|number} [classname=0] クラス名
* @property {string|number} [windowtext=0] ウィンドウ名
*/
/**
* ウィンドウやマウスなどを自動操作するためのクラス
*/
export default class Robot {
/**
* キーを入力する
* - キーコードは定数クラス `Robot.VK` を使用ください
*
* @param {VirtualKeyCode} vkcode - キーコード
* @param {KeyEventOption} [option] - オプション
*/
static setKeyEvent(vkcode, option) {
const KEYEVENTF_KEYUP = 2;
const count_max = (option && option.count_max) ? option.count_max: 1;
const VK = Robot.VK;
let time_ms = (option && option.push_time_sec) ? ((option.push_time_sec * 1000) | 0 ): 0;
time_ms = Math.max(time_ms , 1); // 1以上にする
let code = "for ($i=0; $i -lt " + count_max + "; $i++){";
{
if(option && option.is_pressed_shift) {
code += "$api::keybd_event(" + VK.VK_SHIFT.code + ", 0, 0, 0);";
}
if(option && option.is_pressed_alt) {
code += "$api::keybd_event(" + VK.VK_MENU.code + ", 0, 0, 0);";
}
if(option && option.is_pressed_ctrl) {
code += "$api::keybd_event(" + VK.VK_CONTROL.code + ", 0, 0, 0);";
}
if(!option || !option.is_not_pushed) {
code += "$api::keybd_event(" + vkcode.code + ", 0, 0, 0);";
}
}
if(option && option.push_time_sec) {
code += "Start-Sleep -m " + time_ms + ";";
}
{
if(!option || !option.is_not_released) {
code += "$api::keybd_event(" + vkcode.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);";
}
if(option && option.is_pressed_ctrl) {
code += "$api::keybd_event(" + VK.VK_CONTROL.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);";
}
if(option && option.is_pressed_alt) {
code += "$api::keybd_event(" + VK.VK_MENU.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);";
}
if(option && option.is_pressed_shift) {
code += "$api::keybd_event(" + VK.VK_SHIFT.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);";
}
}
code += "}";
/*
user32.dll
void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo)
for ($i=0; $i -lt " + count_max + "; $i++){
$api::keybd_event(" + VK_DATA.VK_SHIFT.code + ", 0, 0, 0);
$api::keybd_event(" + VK_DATA.VK_MENU.code + ", 0, 0, 0);
$api::keybd_event(" + VK_DATA.VK_CONTROL.code + ", 0, 0, 0);
$api::keybd_event(" + vkcode.code + ", 0, 0, 0);
Start-Sleep -m " + time_ms + ";
$api::keybd_event(" + vkcode.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);
$api::keybd_event(" + VK_DATA.VK_CONTROL.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);
$api::keybd_event(" + VK_DATA.VK_MENU.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);
$api::keybd_event(" + VK_DATA.VK_SHIFT.code + ", 0, " + KEYEVENTF_KEYUP + ", 0);
}
*/
System.callWindowsAPI(
"user32.dll",
"void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo)",
code
);
}
/**
* マウスのクリックを行う
*
* @param {string} type - `"LEFT"`, `"RIGHT"`, `"CLICK"`, `"DOUBLE_CLICK"` といった文字列
* @param {KeyEventOption} [option] - オプション
*/
static setMouseEvent(type, option) {
let count_max = (option && option.count_max) ? option.count_max: 1;
let time_ms = (option && option.push_time_sec) ? ((option.push_time_sec * 1000) | 0 ): 0;
time_ms = Math.max(time_ms , 1); // 1以上にする
let target = type.toUpperCase().trim();
if(target === "CLICK") {
count_max = 1;
target = "LEFT";
}
else if(target === "DOUBLE_CLICK") {
count_max = 2;
target = "LEFT";
}
let pushed_code;
let released_code;
if(target === "LEFT") {
pushed_code = MOUSEEVENTF_DATA.MOUSEEVENTF_LEFTDOWN;
released_code = MOUSEEVENTF_DATA.MOUSEEVENTF_LEFTUP;
}
else if((target === "CENTER") || (target === "MIDDLE")) {
pushed_code = MOUSEEVENTF_DATA.MOUSEEVENTF_MIDDLEDOWN;
released_code = MOUSEEVENTF_DATA.MOUSEEVENTF_MIDDLEUP;
}
if(target === "RIGHT") {
pushed_code = MOUSEEVENTF_DATA.MOUSEEVENTF_RIGHTDOWN;
released_code = MOUSEEVENTF_DATA.MOUSEEVENTF_RIGHTUP;
}
let code = "for ($i=0; $i -lt " + count_max + "; $i++){";
if(!option || !option.is_not_pushed) {
code += "$api::mouse_event(" + pushed_code + ", 0, 0, 0, 0);";
}
if(option && option.push_time_sec) {
code += "Start-Sleep -m " + time_ms + ";";
}
if(!option || !option.is_not_released) {
code += "$api::mouse_event(" + released_code + ", 0, 0, 0, 0);";
}
code += "}";
/*
user32.dll
void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo)
for ($i=0; $i -lt " + count_max + "; $i++){
$api::mouse_event(" + pushed_code + ", 0, 0, 0, 0);
Start-Sleep -m " + time_ms + ";
$api::mouse_event(" + released_code + ", 0, 0, 0, 0);
}
*/
System.callWindowsAPI(
"user32.dll",
"void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo)",
code
);
}
/**
* マウスの座標を調べる
* @returns {WSHRobotPosition}
*/
static getCursorPosition() {
/*
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms");
$X = [System.Windows.Forms.Cursor]::Position.X;
$Y = [System.Windows.Forms.Cursor]::Position.Y;
"$X,$Y"
*/
// eslint-disable-next-line quotes
const command = '[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms");$X = [System.Windows.Forms.Cursor]::Position.X;$Y = [System.Windows.Forms.Cursor]::Position.Y;"$X,$Y"';
const text = System.execPowerShell(command);
const pos_data = text.split(",");
const x = parseFloat(pos_data[0]) | 0;
const y = parseFloat(pos_data[1]) | 0;
return {
x : x, y : y
};
}
/**
* マウスの座標を設定する
* @param {WSHRobotPosition} position
*/
static setCursorPosition(position) {
/*
user32.dll
void SetCursorPos(int X, int Y)
$api::SetCursorPos(" + position.x + ", " + position.y + ");
*/
System.callWindowsAPI(
"user32.dll",
"void SetCursorPos(int X, int Y)",
"$api::SetCursorPos(" + position.x + ", " + position.y + ");"
);
}
/**
* 指定したハンドルを取得する
* @param {RobotGetHandleData} get_handle_data
* @returns {number}
*/
static getHandle(get_handle_data) {
let function_text;
// 省略する場合はヌルポインタを設定する必要があるため、入力引数を変更する
if(get_handle_data.classname && get_handle_data.windowtext) {
function_text = "IntPtr FindWindow(string lpClassName, string lpWindowName)";
}
else if(get_handle_data.classname) {
function_text = "IntPtr FindWindow(string lpClassName, IntPtr lpWindowName)";
}
else {
function_text = "IntPtr FindWindow(IntPtr lpClassName, string lpWindowName)";
}
let command = "$api::FindWindow(";
command += (get_handle_data.classname ? "\"" + get_handle_data.classname + "\"" : "0") + ",";
command += (get_handle_data.windowtext ? "\"" + get_handle_data.windowtext + "\"" : "0") + ");";
/*
user32.dll
IntPtr FindWindow(string lpClassName, string lpWindowName)
IntPtr FindWindow(string lpClassName, IntPtr lpWindowName)
IntPtr FindWindow(IntPtr lpClassName, string lpWindowName)
$api::FindWindow(*,*);
*/
return parseFloat(System.callWindowsAPI( "user32.dll", function_text, command));
}
/**
* 指定したクラス名のハンドルを取得する
* @param {string} classname
* @returns {number}
*/
static getHandleOfClassName(classname) {
// console.log(Robot.getHandleOfClassName("Notepad"));
return Robot.getHandle({classname : classname});
}
/**
* 指定したハンドルのクラス名を取得する
* @param {number} handle
* @returns {string}
*/
static getClassName(handle) {
/*
user32.dll
IntPtr GetClassName(IntPtr hWnd, System.Text.StringBuilder text, int count)
$buff = New-Object System.Text.StringBuilder 256;
$null = $api::GetClassName(" + handle + ", $buff, 256);
$($buff.ToString());
*/
return System.callWindowsAPI(
"user32.dll",
"IntPtr GetClassName(IntPtr hWnd, System.Text.StringBuilder text, int count)",
"$buff = New-Object System.Text.StringBuilder 256;$null = $api::GetClassName(" + handle + ", $buff, 256);$($buff.ToString());"
);
}
/**
* 指定したウィンドウ名のハンドルを取得する
* @param {string} windowname
* @returns {number}
*/
static getHandleOfWindowText(windowname) {
// console.log(Robot.getHandleOfWindowName("無題 - メモ帳");
return Robot.getHandle({windowtext : windowname});
}
/**
* 指定したハンドルのウィンドウ名を取得する
* @param {number} handle
* @returns {string}
*/
static getWindowText(handle) {
/*
user32.dll
IntPtr GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count)
$buff = New-Object System.Text.StringBuilder 256;
$null = $api::GetWindowText(" + handle + ", $buff, 256);
$($buff.ToString());
*/
return System.callWindowsAPI(
"user32.dll",
"IntPtr GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count)",
"$buff = New-Object System.Text.StringBuilder 256;$null = $api::GetWindowText(" + handle + ", $buff, 256);$($buff.ToString());"
);
}
/**
* 指定したハンドルの位置とサイズを取得する
* @param {number} handle
* @returns {WSHRobotRect}
*/
static getWindowRect(handle) {
/*
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public struct RECT { public int Left; public int Top; public int Right; public int Bottom; }
public class API {
[DllImport("user32.dll")] public extern static bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
public static RECT getrect(IntPtr hwnd) { RECT rect = new RECT(); GetWindowRect(hwnd, out rect); return rect; }
}
"@
$rect = [API]::getrect(x);
"$($rect.Left),$($rect.Top),$($rect.Right),$($rect.Bottom)"
*/
// eslint-disable-next-line quotes
const command = `Add-Type -TypeDefinition "using System; using System.Runtime.InteropServices; public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } public class API { [DllImport(""user32.dll"")] public extern static bool GetWindowRect(IntPtr hWnd, out RECT lpRect); public static RECT getrect(IntPtr hwnd) { RECT rect = new RECT(); GetWindowRect(hwnd, out rect); return rect; } }"; $rect = [API]::getrect(` + handle + `); "$($rect.Left),$($rect.Top),$($rect.Right),$($rect.Bottom)"`;
const rect = System.execPowerShell(command);
const rect_data = rect.split(",");
if(rect_data.length !== 4) {
return null;
}
const left = parseFloat(rect_data[0]) | 0;
const top = parseFloat(rect_data[1]) | 0;
const right = parseFloat(rect_data[2]) | 0;
const bottom = parseFloat(rect_data[3]) | 0;
return {
x :left,
y :top,
width :right - left,
height :bottom - top
};
}
/**
* 指定したハンドルの位置とサイズを設定する
* @param {number} handle
* @param {WSHRobotRect} rect
* @returns {void}
*/
static setWindowRect(handle, rect) {
/*
user32.dll
bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, int bRepaint)
$api::MoveWindow(" + handle + " , " + (rect.x|0) + ", " + (rect.y|0) + ", " + (rect.width|0) + ", " + (rect.height|0) + ", 1 );
*/
System.callWindowsAPI(
"user32.dll",
"bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, int bRepaint)",
"$api::MoveWindow(" + handle + " , " + (rect.x|0) + ", " + (rect.y|0) + ", " + (rect.width|0) + ", " + (rect.height|0) + ", 1 );"
);
}
/**
* アクティブなウィンドウのハンドルを取得する
* @returns {number}
*/
static getActiveWindow() {
/*
user32.dll
IntPtr GetForegroundWindow()
$api::GetForegroundWindow();
*/
return parseFloat(System.callWindowsAPI(
"user32.dll",
"IntPtr GetForegroundWindow()",
"$api::GetForegroundWindow();"
));
}
/**
* アクティブなウィンドウを設定する
* @param {number} handle
* @returns {void}
*/
static setActiveWindow(handle) {
/*
user32.dll
bool SetForegroundWindow(IntPtr hWnd)
$api::SetForegroundWindow(" + handle + ");
*/
System.callWindowsAPI(
"user32.dll",
"bool SetForegroundWindow(IntPtr hWnd)",
"$api::SetForegroundWindow(" + handle + ");"
);
}
/**
* 指定したハンドルのプロセスIDを取得する
* @param {number} handle
* @returns {number}
*/
static getPID(handle) {
/*
user32.dll
IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId)
$getpid = 0;
$null = $api::GetWindowThreadProcessId(" + handle + ", [ref] $getpid);
$getpid;
*/
return parseFloat(System.callWindowsAPI(
"user32.dll",
"IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId)",
"$getpid = 0;$null = $api::GetWindowThreadProcessId(" + handle + ", [ref] $getpid);$getpid;"
));
}
/**
* 指定したプロセスIDを終了させる
* @param {number} pid
*/
static terminateProcess(pid) {
return System.run("taskkill /PID " + pid, System.AppWinStype.Hide, true);
}
}
/**
* 仮想キーコード一覧
* @type {VirtualKeyCodes}
*/
Robot.VK = {
VK_LBUTTON :{code:0x01},
VK_RBUTTON :{code:0x02},
VK_CANCEL :{code:0x03},
VK_MBUTTON :{code:0x04},
VK_XBUTTON1 :{code:0x05},
VK_XBUTTON2 :{code:0x06},
VK_BACK :{code:0x08},
VK_TAB :{code:0x09},
VK_CLEAR :{code:0x0C},
VK_RETURN :{code:0x0D},
VK_SHIFT :{code:0x10},
VK_CONTROL :{code:0x11},
VK_MENU :{code:0x12},
VK_PAUSE :{code:0x13},
VK_CAPITAL :{code:0x14},
VK_KANA :{code:0x15},
VK_HANGEUL :{code:0x15},
VK_HANGUL :{code:0x15},
VK_JUNJA :{code:0x17},
VK_FINAL :{code:0x18},
VK_HANJA :{code:0x19},
VK_KANJI :{code:0x19},
VK_ESCAPE :{code:0x1B},
VK_CONVERT :{code:0x1C},
VK_NONCONVERT :{code:0x1D},
VK_ACCEPT :{code:0x1E},
VK_MODECHANGE :{code:0x1F},
VK_SPACE :{code:0x20},
VK_PRIOR :{code:0x21},
VK_NEXT :{code:0x22},
VK_END :{code:0x23},
VK_HOME :{code:0x24},
VK_LEFT :{code:0x25},
VK_UP :{code:0x26},
VK_RIGHT :{code:0x27},
VK_DOWN :{code:0x28},
VK_SELECT :{code:0x29},
VK_PRINT :{code:0x2A},
VK_EXECUTE :{code:0x2B},
VK_SNAPSHOT :{code:0x2C},
VK_INSERT :{code:0x2D},
VK_DELETE :{code:0x2E},
VK_HELP :{code:0x2F},
VK_0 :{code:0x30},
VK_1 :{code:0x31},
VK_2 :{code:0x32},
VK_3 :{code:0x33},
VK_4 :{code:0x34},
VK_5 :{code:0x35},
VK_6 :{code:0x36},
VK_7 :{code:0x37},
VK_8 :{code:0x38},
VK_9 :{code:0x39},
VK_A :{code:0x41},
VK_B :{code:0x42},
VK_C :{code:0x43},
VK_D :{code:0x44},
VK_E :{code:0x45},
VK_F :{code:0x46},
VK_G :{code:0x47},
VK_H :{code:0x48},
VK_I :{code:0x49},
VK_J :{code:0x4A},
VK_K :{code:0x4B},
VK_L :{code:0x4C},
VK_M :{code:0x4D},
VK_N :{code:0x4E},
VK_O :{code:0x4F},
VK_P :{code:0x50},
VK_Q :{code:0x51},
VK_R :{code:0x52},
VK_S :{code:0x53},
VK_T :{code:0x54},
VK_U :{code:0x55},
VK_V :{code:0x56},
VK_W :{code:0x57},
VK_X :{code:0x58},
VK_Y :{code:0x59},
VK_Z :{code:0x5A},
VK_LWIN :{code:0x5B},
VK_RWIN :{code:0x5C},
VK_APPS :{code:0x5D},
VK_SLEEP :{code:0x5F},
VK_NUMPAD0 :{code:0x60},
VK_NUMPAD1 :{code:0x61},
VK_NUMPAD2 :{code:0x62},
VK_NUMPAD3 :{code:0x63},
VK_NUMPAD4 :{code:0x64},
VK_NUMPAD5 :{code:0x65},
VK_NUMPAD6 :{code:0x66},
VK_NUMPAD7 :{code:0x67},
VK_NUMPAD8 :{code:0x68},
VK_NUMPAD9 :{code:0x69},
VK_MULTIPLY :{code:0x6A},
VK_ADD :{code:0x6B},
VK_SEPARATOR :{code:0x6C},
VK_SUBTRACT :{code:0x6D},
VK_DECIMAL :{code:0x6E},
VK_DIVIDE :{code:0x6F},
VK_F1 :{code:0x70},
VK_F2 :{code:0x71},
VK_F3 :{code:0x72},
VK_F4 :{code:0x73},
VK_F5 :{code:0x74},
VK_F6 :{code:0x75},
VK_F7 :{code:0x76},
VK_F8 :{code:0x77},
VK_F9 :{code:0x78},
VK_F10 :{code:0x79},
VK_F11 :{code:0x7A},
VK_F12 :{code:0x7B},
VK_F13 :{code:0x7C},
VK_F14 :{code:0x7D},
VK_F15 :{code:0x7E},
VK_F16 :{code:0x7F},
VK_F17 :{code:0x80},
VK_F18 :{code:0x81},
VK_F19 :{code:0x82},
VK_F20 :{code:0x83},
VK_F21 :{code:0x84},
VK_F22 :{code:0x85},
VK_F23 :{code:0x86},
VK_F24 :{code:0x87},
VK_NUMLOCK :{code:0x90},
VK_SCROLL :{code:0x91},
VK_LSHIFT :{code:0xA0},
VK_RSHIFT :{code:0xA1},
VK_LCONTROL :{code:0xA2},
VK_RCONTROL :{code:0xA3},
VK_LMENU :{code:0xA4},
VK_RMENU :{code:0xA5},
VK_BROWSER_BACK :{code:0xA6},
VK_BROWSER_FORWARD :{code:0xA7},
VK_BROWSER_REFRESH :{code:0xA8},
VK_BROWSER_STOP :{code:0xA9},
VK_BROWSER_SEARCH :{code:0xAA},
VK_BROWSER_FAVORITES :{code:0xAB},
VK_BROWSER_HOME :{code:0xAC},
VK_VOLUME_MUTE :{code:0xAD},
VK_VOLUME_DOWN :{code:0xAE},
VK_VOLUME_UP :{code:0xAF},
VK_MEDIA_NEXT_TRACK :{code:0xB0},
VK_MEDIA_PREV_TRACK :{code:0xB1},
VK_MEDIA_STOP :{code:0xB2},
VK_MEDIA_PLAY_PAUSE :{code:0xB3},
VK_LAUNCH_MAIL :{code:0xB4},
VK_LAUNCH_MEDIA_SELECT :{code:0xB5},
VK_LAUNCH_APP1 :{code:0xB6},
VK_LAUNCH_APP2 :{code:0xB7},
VK_OEM_1 :{code:0xBA},
VK_OEM_PLUS :{code:0xBB},
VK_OEM_COMMA :{code:0xBC},
VK_OEM_MINUS :{code:0xBD},
VK_OEM_PERIOD :{code:0xBE},
VK_OEM_2 :{code:0xBF},
VK_OEM_3 :{code:0xC0},
VK_OEM_4 :{code:0xDB},
VK_OEM_5 :{code:0xDC},
VK_OEM_6 :{code:0xDD},
VK_OEM_7 :{code:0xDE},
VK_OEM_8 :{code:0xDF},
VK_PROCESSKEY :{code:0xE5},
VK_ATTN :{code:0xF6},
VK_CRSEL :{code:0xF7},
VK_EXSEL :{code:0xF8},
VK_EREOF :{code:0xF9},
VK_PLAY :{code:0xFA},
VK_ZOOM :{code:0xFB},
VK_NONAME :{code:0xFC},
VK_PA1 :{code:0xFD},
VK_OEM_CLEAR :{code:0xFE}
};