Contents
- 1 CLOSEとCLOSE2の違い
- 2 指定したIEオブジェクトを含むウィンドウ(すべてのタブ)を閉じる
- 3 プログラム実行例
- 3.1 メモ帳の右クリックメニューを表示させる
- 3.2 コントロールパネルを起動する
- 3.3 UWSCを起動したときのウィンドウの座標をマウス位置の座標に書き換える
- 3.4 ペイントを起動
- 3.5 電卓(ストアアプリ)を起動
- 3.6 PowerPointを起動する(Excel)
- 3.7 Outlookを起動する(Excel)
- 3.8 メモ帳に本文を入力し[名前を付けて保存]ダイアログボックスを開いて保存する
- 3.9 仮想キーで文章を入力
- 3.10 Wordを起動する(Excel)
- 3.11 メモ帳を幅400、高さ300で画面中央に表示
- 3.12 Yahoo!天気・災害情報より直近に発生した地震情報を取得しその場所をGoogleマップで表示
- 3.13 ペイントで設定できるズーム倍率を取得
ウィンドウの状態を操作します。ウィンドウを終了、アクティブ化、表示・非表示、最大化・最小化などができます。第一引数のIDはGETIDで取得します。
- 構文
- void = CTRLWIN( ID, 命令 )
- 引数
- ID
- Windowを識別するID
- 命令
- CLOSE
- 終了
- CLOSE2
- 終了(QUIT)
- ACTIVATE
- アクティブ
- HIDE
- 非表示
- SHOW
- 表示
- MIN
- アイコン化
- MAX
- 最大化
- NORMAL
- サイズ戻す
- TOPMOST
- 最前面に固定
- NOTOPMOST
- 最前面固定を解除
- TOPNOACTV
- 最前面にするがアクティブ化はしない
- 戻り値
CLOSEとCLOSE2の違い
CLOSEは変更箇所があれば保存するかどうかの確認メッセージを表示するのに対し、CLOSE2は確認メッセージを表示せず強制的に終了します。
CTRLWIN(ID, CLOSE)
CTRLWIN(ID, CLOSE2)
指定したIEオブジェクトを含むウィンドウ(すべてのタブ)を閉じる
Internet Explorerのウィンドウを閉じます。IE.Quitは指定したInternetExplorerオブジェクトしか閉じませんが、CTRLWINを使うとIEオブジェクトを含むウィンドウを閉じることができます。
CTRLWIN(HNDTOID(IE.hwnd), CLOSE)
プログラム実行例
メモ帳の右クリックメニューを表示させる
DIM ID = EXEC("notepad")
CTRLWIN(ID, ACTIVATE)
KBD(VK_APPS, CLICK, 1000)
コントロールパネルを起動する
DIM Shell = CREATEOLEOBJ("Shell.Application")
Shell.ControlPanelItem("control")
SLEEP(3.000)
DIM ID = GETID("コントロール パネル")
//CTRLWIN(ID, CLOSE)
解説
- 1行目
- Shellオブジェクトを生成。
DIM Shell = CREATEOLEOBJ("Shell.Application")
- 2行目
- コントロールパネルを起動。
Shell.ControlPanelItem("control")
- 3行目
- 3.000秒待機する。
SLEEP(3.000)
- 5行目
- コントロールパネルのIDを取得する。
DIM ID = GETID("コントロール パネル")
- 6行目
- コントロールパネルを閉じる。
//CTRLWIN(ID, CLOSE)
UWSCを起動したときのウィンドウの座標をマウス位置の座標に書き換える
CTRLWIN(GETID("UWSC Pro"), CLOSE)
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
DIM username = WshShell.ExpandEnvironmentStrings("%USERNAME%")
SELECT TRUE
CASE KINDOFOS() >= 20
path = "C:\Users\" + username + "\AppData\Roaming\UWSC\UWSC.INI"
CASE KINDOFOS() = 13
path = "C:\Documents and Settings\" + username + "\Application Data\UWSC\UWSC.INI"
DEFAULT
MSGBOX("UWSC.INIのパスを特定できませんでした。")
EXIT
SELEND
PRINT WRITEINI("SET", "Position", G_MOUSE_X + "," + G_MOUSE_Y, path)
解説
- 1行目
- UWSCを終了
CTRLWIN(GETID("UWSC Pro"), CLOSE)
- 3行目
- WshShellオブジェクトを生成。
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
- 4行目
- PCのユーザー名を取得。
DIM username = WshShell.ExpandEnvironmentStrings("%USERNAME%")
- 6-14行目
SELECT TRUE CASE KINDOFOS() >= 20 path = "C:\Users\" + username + "\AppData\Roaming\UWSC\UWSC.INI" CASE KINDOFOS() = 13 path = "C:\Documents and Settings\" + username + "\Application Data\UWSC\UWSC.INI" DEFAULT MSGBOX("UWSC.INIのパスを特定できませんでした。") EXIT SELEND
- KINDOFOS() >= 20(OSがVista以降ならば)
- pathに「C:\Users\username\AppData\Roaming\UWSC\UWSC.INI」を代入
- KINDOFOS() = 13(OSがWindows XPならば)
- pathに「C:\Documents and Settings\username\Application Data\UWSC\UWSC.INI」を代入
- DEFAULT(それ以外ならば)
- 「UWSC.INIのパスを特定できませんでした。」と表示しプログラムを終了する。
- 16行目
- SETセクションのPositionキーの値をマウス位置の座標に書き換え、その値を取得・出力する。
PRINT WRITEINI("SET", "Position", G_MOUSE_X + "," + G_MOUSE_Y, path)
ペイントを起動
DIM ID = EXEC("mspaint")
//CTRLWIN(ID, CLOSE)
解説
- 1行目
- ペイントを起動し、IDを取得する。
DIM ID = EXEC("mspaint")
- 2行目
- ペイントを終了する。
//CTRLWIN(ID, CLOSE)
電卓(ストアアプリ)を起動
EXEC("calc")
DIM ID = GETID("電卓")
// CTRLWIN(ID, CLOSE)
解説
- 1行目
- 電卓を起動。
EXEC("calc")
- 2行目
- 電卓のIDを取得。EXEC関数は起動したときに戻値としてIDを返すが、ストアアプリなど一部のアプリはIDを返してくれないので起動後にGETID関数で取得します。
DIM ID = GETID("電卓")
- 4行目
- 電卓を閉じる。
// CTRLWIN(ID, CLOSE)
PowerPointを起動する(Excel)
CONST xlMicrosoftPowerPoint = 2
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Application.ActivateMicrosoftApp(xlMicrosoftPowerPoint)
DIM ID = GETID("PowerPoint", "PPTFrameClass")
SLEEP(5.000)
CTRLWIN(ID, CLOSE)
Excel.Quit
- CREATEOLEOBJ
- Excel.Application.Visible
- Excel.Application.ActivateMicrosoftApp
- GETID
- SLEEP
- CTRLWIN
- Excel.Application.Quit
Outlookを起動する(Excel)
CONST xlMicrosoftMail = 3
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Application.ActivateMicrosoftApp(xlMicrosoftMail)
DIM ID = GETID("Outlook", "rctrl_renwnd32")
SLEEP(5.000)
CTRLWIN(ID, CLOSE)
Excel.Quit
- CREATEOLEOBJ
- Excel.Application.Visible
- Excel.Application.ActivateMicrosoftApp
- GETID
- SLEEP
- CTRLWIN
- Excel.Application.Quit
メモ帳に本文を入力し[名前を付けて保存]ダイアログボックスを開いて保存する
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM path = "D:\Desktop\sample.txt"
DIM folderspec = FSO.GetParentFolderName(path)
DIM filename = FSO.GetFileName(path)
EXEC("notepad")
DIM ID = GETID("メモ帳", "Notepad")
SENDSTR(ID, "内容", 0)
CLKITEM(ID, "ファイル\名前を付けて保存", CLK_MENU)
IFB FSO.FolderExists(folderspec) THEN
DIM ID2 = GETID("名前を付けて保存", "#32770")
CTRLWIN(ID2, ACTIVATE)
SLEEP(0.500)
SCKEY(ID2, VK_F4)
SENDSTR(ID2, folderspec, 1, TRUE)
SCKEY(ID2, VK_RETURN)
SLEEP(0.500)
SCKEY(ID2, VK_ALT, VK_N)
SENDSTR(ID2, filename, 1, TRUE)
SLEEP(0.500)
CLKITEM(ID, "保存", ITM_BTN)
ELSE
PRINT "フォルダが存在しません。"
ENDIF
- CREATEOLEOBJ
- FSO.GetParentFolderName
- FSO.GetFileName
- EXEC
- GETID
- SENDSTR
- CLKITEM
- FSO.FolderExists
- CTRLWIN
- SLEEP
- SCKEY
解説
- 1行目
- FileSystemObjectオブジェクトを生成。
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
- 2行目
- 保存先のパスを指定。
DIM path = "D:\Desktop\sample.txt"
- 3行目
- パスからフォルダ部分を取得。
DIM folderspec = FSO.GetParentFolderName(path)
- 4行目
- パスからファイル名を取得。
DIM filename = FSO.GetFileName(path)
- 6行目
- メモ帳を起動。
EXEC("notepad")
- 7行目
- メモ帳のIDを取得。
DIM ID = GETID("メモ帳", "Notepad")
- 8行目
- メモ帳に文章を入力。
SENDSTR(ID, "内容", 0)
- 9行目
- [名前を付けて保存]を実行。
CLKITEM(ID, "ファイル\名前を付けて保存", CLK_MENU)
- 12行目
- [名前を付けて保存]ダイアログボックスのIDを取得。
DIM ID2 = GETID("名前を付けて保存", "#32770")
- 14行目
- [名前を付けて保存]ウインドウをアクティブ化する。
CTRLWIN(ID2, ACTIVATE)
- 15行目
- 0.500秒待機する。
SLEEP(0.500)
- 17行目
- F4キーでアドレスバーを選択。
SCKEY(ID2, VK_F4)
- 18行目
- フォルダ名を入力。
SENDSTR(ID2, folderspec, 1, TRUE)
- 19行目
- Enterキーで確定・移動。
SCKEY(ID2, VK_RETURN)
- 20行目
- 0.500秒待機する。
SLEEP(0.500)
- 22行目
- Alt+Nでファイル名を選択。
SCKEY(ID2, VK_ALT, VK_N)
- 23行目
- ファイル名を入力。
SENDSTR(ID2, filename, 1, TRUE)
- 24行目
- 0.500秒待機する。
SLEEP(0.500)
- 26行目
- [保存]ボタンをクリックする。
CLKITEM(ID, "保存", ITM_BTN)
仮想キーで文章を入力
DIM ID = EXEC("notepad")
CTRLWIN(ID, ACTIVATE)
SCKEY(ID, VK_SHIFT, VK_T)
SCKEY(ID, VK_H, VK_I, VK_S, VK_SPACE, VK_I, VK_S, VK_SPACE, VK_A, VK_SPACE, VK_P, VK_E, VK_N, VK_OEM_PERIOD)
- 結果
This is a pen.
Wordを起動する(Excel)
CONST xlMicrosoftWord = 1
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
// Wordを起動
Excel.Application.ActivateMicrosoftApp(xlMicrosoftWord)
DIM ID = GETID("Microsoft Word", "OpusApp")
SLEEP(5.000)
// Wordを閉じる
CTRLWIN(ID, CLOSE)
Excel.Quit
- CREATEOLEOBJ
- Excel.Application.Visible
- Excel.Application.ActivateMicrosoftApp
- GETID
- SLEEP
- CTRLWIN
- Excel.Application.Quit
メモ帳を幅400、高さ300で画面中央に表示
DIM w = 400
DIM h = 300
DIM sw = G_SCREEN_W
DIM sh = G_SCREEN_H
DIM ID = EXEC("notepad", FALSE, (sw - w) / 2, (sh - h) / 2, w, h)
//CTRLWIN(ID, CLOSE2)
Yahoo!天気・災害情報より直近に発生した地震情報を取得しその場所をGoogleマップで表示
DIM IE = IEBoot()
IE.Navigate("http://typhoon.yahoo.co.jp/weather/earthquake/")
BusyWait(IE)
DIM ID = GETID("地震情報")
CTRLWIN(ID, MAX)
DIM array[-1][-1]
DIM element = IE.document.getElementById("eqinfdtl")
DIM elements = element.getElementsByTagName("table")
element = elements.Item(0)
getTableData(element, array)
HASHTBL tbl
FOR r = 0 TO UBound(array)
tbl[TRIM(array[r][0])] = array[r][1]
NEXT
DIM way[1]
IF POS("北緯", tbl["緯度/経度"]) THEN way[0] = "N"
IF POS("東経", tbl["緯度/経度"]) THEN way[1] = "E"
IF POS("西経", tbl["緯度/経度"]) THEN way[1] = "W"
IF POS("南緯", tbl["緯度/経度"]) THEN way[0] = "S"
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "度", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "北緯", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "東経", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "西経", "-")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "南緯", "-")
DIM coordinate = SPLIT(TRIM(tbl["緯度/経度"]), "/")
DIM z = 7
DIM url = "https://www.google.co.jp/maps/place/" + degToDMS(coordinate[0]) + way[0] + "," + degToDMS(coordinate[1]) + way[1] + "/@" + coordinate[0] + "," + coordinate[1] + "," + z + "z/"
url = REPLACE(url, "°", "%C2%B0")
url = REPLACE(url, "<#DBL>", "")
IE.Navigate(url)
BusyWait(IE)
//////////////////////////////////////////////////
// 【引数】
// IE : IEオブジェクト
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
SLEEP(0.500)
DIM t = GETTIME()
TRY
REPEAT
DIM tm = GETTIME() - t
FUKIDASI("BusyWait:" + tm)
SLEEP(0.010)
IF tm >= 60 THEN BREAK
UNTIL !IE.Busy AND IE.readyState = 4
EXCEPT
IE = getIEObj(-1)
PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
BusyWait(IE)
ENDTRY
FUKIDASI()
FEND
//////////////////////////////////////////////////
// 【引数】
// deg : 角度(°)
// 【戻値】
// 角度(deg°分'秒")
//////////////////////////////////////////////////
FUNCTION degToDMS(deg)
DIM degree = INT(deg)
DIM minute = (deg - INT(deg)) * 60
DIM second = ROUND(minute - INT(minute), -10) * 60
RESULT = degree + "°" + INT(minute) + "'" + ROUND(second, -5) + ""
FEND
//////////////////////////////////////////////////
// 【引数】
// 文字列 or 数値 : 取得したいIEオブジェクトのタイトル・URLもしくは数値を指定
// 完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得)
// 【戻値】
// Internet Explorerオブジェクト
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
DIM Shell = CREATEOLEOBJ("Shell.Application")
SELECT CHKNUM(str)
CASE TRUE
DIM cnt = 0
SELECT TRUE
CASE str > 0
FOR n = 0 TO Shell.Windows.Count - 1
TRY
IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
cnt = cnt + 1
IFB str = cnt THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
ENDIF
EXCEPT
ENDTRY
NEXT
CASE str = 5
SELEND
RESULT = ERR_VALUE
FEND
//////////////////////////////////////////////////
// 【引数】
// table : tableエレメント
// arr : 取得したデータを格納する配列(参照引数)
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE getTableData(table, Var arr[][])
rowMax = table.rows.length - 1
colMax = 0
FOR row = 0 TO table.rows.length - 1
IFB table.rows(row).cells.length - 1 > colMax THEN
colMax = table.rows(row).cells.length - 1
ENDIF
NEXT
DIM arr[rowMax][colMax]
FOR row = 0 TO table.rows.length - 1
FOR col = 0 TO table.rows(row).cells.length - 1
n = 0
WHILE arr[row][col + n] ""
n = n + 1
WEND
arr[row][col + n] = table.rows(row).cells(col).innerText
IFB table.rows(row).cells(col).rowSpan > 1 AND table.rows(row).cells(col).colSpan > 1 THEN
rmax = table.rows(row).cells(col).rowSpan - 1
cmax = table.rows(row).cells(col).colSpan - 1
FOR r = 1 TO rmax
FOR c = 1 TO cmax
arr[row + r][col + c] = "←"
NEXT
NEXT
ENDIF
IFB table.rows(row).cells(col).rowSpan > 1 THEN
n = table.rows(row).cells(col).rowSpan - 1
WHILE n
arr[row + n][col] = "↑"
n = n - 1
WEND
ENDIF
IFB table.rows(row).cells(col).colSpan > 1 THEN
n = table.rows(row).cells(col).colSpan - 1
WHILE n
arr[row][col + n] = "←"
n = n - 1
WEND
ENDIF
NEXT
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// InPrivate : InPrivateブラウズ・モードを有効にするときはTRUEを指定(デフォルトはFALSE)
// 【戻値】
// InternetExplorerオブジェクト
//////////////////////////////////////////////////
FUNCTION IEBoot(InPrivate = FALSE)
DIM IE
SELECT InPrivate
CASE TRUE
DOSCMD("start iexplore -private")
GETID("InPrivate - Internet Explorer - [InPrivate]", "IEFrame", -1)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application","InPrivate - Internet Explorer - [InPrivate]")
CASE FALSE
TRY
IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
EXCEPT
EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
GETID("Internet Explorer", "IEFrame", -1)
TRY
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
EXCEPT
IE = getIEObj(-1)
ENDTRY
ENDTRY
SELEND
RESULT = IE
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- IEBoot
- IE.Navigate
- BusyWait
- GETID
- CTRLWIN
- document.getElementById
- Element.getElementsByTagName
- Elements.Item
- getTableData
- UBound
- TRIM
- POS
- REPLACE
- SPLIT
- degToDMS
ペイントで設定できるズーム倍率を取得
DIM ID = EXEC("mspaint")
SETSLIDER(ID, 0, 0)
PRINT GETSTR(ID, 2, STR_STATIC)
REPEAT
CLKITEM(ID, "拡大", CLK_BTN)
PRINT GETSTR(ID, 2, STR_STATIC)
UNTIL GETSLIDER(ID, 0, SLD_POS) = 100
CTRLWIN(ID, CLOSE2)
- 結果
12.50% 25% 50% 100% 200% 300% 400% 500% 600% 700% 800%
関連記事
- ACW (スクリプト関数)
- 指定したIDのウィンドウの位置・サイズを変更します。IDのみを指定した場合、そのウィンドウをアクティブにします。
- GETALLWIN (スクリプト関数)
- 全ウィンドウのIDを取得します。
- CascadeWindows メソッド (Shell)
- デスクトップ上のすべてのウィンドウをカスケードします。この方法は、タスクバーを右クリックして「重ねて表示」を選択するのと同じ効果があります。
- MinimizeAll メソッド (Shell)
- デスクトップ上のすべてのウィンドウを最小化します。この方法は、タスクバーを右クリックして古いシステムで[すべてのウィンドウを最小化]を選択するか、Windows 2000またはWindows XPのタスクバーのクイック起動領域にある[デスクトップの表示]アイコンをクリックするのと同じ効果があります。
- TileHorizontally メソッド (Shell)
- すべてのウィンドウを上下に並べて表示します。
- TileVertically メソッド (Shell)
- すべてのウィンドウを左右に並べて表示します。
- UndoMinimizeALL メソッド (Shell)
- MinimizeAllで最小化したウィンドウを元に戻します。
- CHKBTN (スクリプト関数)
- 指定したIDのウィンドウにあるチェックボックス・ラジオボタンがチェックされているかを返します。
- CLKITEM (スクリプト関数)
- 指定したIDのウィンドウのアイテムをクリックします。アイテムに指定できるものにはボタン・チェックボックス・ラジオボタン・リストボックス・コンボボックス・タブコントロール・メニュー・ツリービュー・リストビュー・ツールバー・リンクがあります。
- GETID (スクリプト関数)
- 指定したウィンドウのIDを取得します。第一引数に取得したいウィンドウのタイトル(一部でも可)を指定します。UWSCでウィンドウを操作するのによく使う関数です。
- GETITEM (スクリプト関数)
- 指定したIDのウィンドウのキャプション文字やリストなどを取得すします。取得した情報は配列変数のALL_ITEM_LIST[ ]に格納されます。戻値は取得した数でInteger型です。
- GETSLIDER (スクリプト関数)
- スライダー(トラックバー、スクロールバー)の値を取得します。
- GETSTR (スクリプト関数)
- 引数に指定したIDのウィンドウの文字列を取得します。取得した文字列を返します。
- HNDTOID (スクリプト関数)
- 引数に指定したハンドル値をIDに変換して返します。IDをハンドル値に変換するにはIDTOHND関数を使います。
- IDTOHND (スクリプト関数)
- 引数に指定したIDをハンドル値に変換して返します。ハンドル値をIDに変換するにはHNDTOID関数を使います。
- GETCTLHND (スクリプト関数)
- ボタン等、オブジェクトのハンドルを取得します。
- MOUSEORG (スクリプト関数)
- マウス座標を相対座標にする、 またはマウスとキー情報を直接ウィンドウへ送ります。
- SCKEY (スクリプト関数)
- ショートカットキーを実行します。
- SENDSTR (スクリプト関数)
- 指定したIDのウィンドウに文字列を送信します。キー入力をする場合はKBD関数を使います。
- SETSLIDER (スクリプト関数)
- スライダー(トラックバー、スクロールバー)の値を設定します。
- STATUS (スクリプト関数)
- ウィンドウの各種状態を取得します。タイトル・クラス名・X座標・Y座標・幅・高さなどを取得することができます。