STATUSステータス関数

本ページには広告が含まれています。

ウィンドウの各種状態を返します。

構文
  1. return = STATUS( ID, 取得項目 )
引数
ID (Integer)必須
Windowを識別するID
取得項目 (#status必須
以下の定数
ST_TITLE
タイトルを返す(型:UNICODE文字列)
ST_CLASS
クラス名を返す(型:UNICODE文字列)
ST_X
X座標を返す(型:4バイト整数(符号付))
ST_Y
Y座標を返す(型:4バイト整数(符号付))
ST_WIDTH
幅を返す(型:4バイト整数(符号付))
ST_HEIGHT
高さを返す(型:4バイト整数(符号付))
ST_CLX
クライアント領域のX座標を返す(型:4バイト整数(符号付))
ST_CLY
クライアント領域のY座標を返す(型:4バイト整数(符号付))
ST_CLWIDTH
クライアント領域の幅を返す(型:4バイト整数(符号付))
ST_CLHEIGHT
クライアント領域の高さを返す(型:4バイト整数(符号付))
ST_PARENT
親ウィンドウのIDを返す、親が無ければ-1(型:4バイト整数(符号付))
ST_ICON
アイコン状態であればTrue、でなければFalse(型:ブール型)
ST_MAXIMIZED
最大化状態であればTrue、でなければFalse(型:ブール型)
ST_VISIBLE
通常の表示状態であればTrue、でなければFalse(型:ブール型)
ST_ACTIVE
アクティブ状態であればTrue、でなければFalse(型:ブール型)
ST_BUSY
ビジー状態であればTrue、でなければFalse(型:ブール型)
ST_ISID
有効なIDであればTrue、でなければFalse(型:ブール型)
ST_WIN64
64bitアプリであればTrue、でなければFalse(型:ブール型)
ST_PATH
EXEのパスを返す(型:UNICODE文字列)
ST_PROCESS
プロセスIDを返す(型:4バイト整数(符号なし))
ST_MONITOR
表示されているモニタ番号を返す(型:4バイト整数(符号付))
戻り値
取得した値

取得項目

ウィンドウの座標・幅

STATUS.png
ST_TITLE
タイトルバーに表示されるタイトルを返します。
ST_CLASS
アプリケーション作成者がアプリケーションに付与する内部的な名前であるクラス名を返します。
ST_X
ウィンドウのX座標を返します。返す値はウィンドウ左上を基準としたX座標となります。
ST_Y
ウィンドウのY座標を返します。返す値はウィンドウ左上を基準としたY座標となります。
ST_WIDTH
ウィンドウの幅を返します。
ST_HEIGHT
ウィンドウの高さを返します。
ST_CLX
クライアント領域のX座標を返します。返す値はクライアント領域左上を基準としたX座標となります。
ST_CLY
クライアント領域のY座標を返します。返す値はクライアント領域左上を基準としたY座標となります。
ST_CLWIDTH
クライアント領域の幅を返します。
ST_CLHEIGHT
クライアント領域の高さを返します。

座標とサイズを組み合わせることでウィンドウの左上・右上・左下・右下の座標を計算で求めることができます。

UWSC
DIM ID = GETID(GET_FROMPOINT_WIN)

DIM x
DIM y

// 左上
x = STATUS(ID, ST_X)
y = STATUS(ID, ST_Y)

// 右上
x = STATUS(ID, ST_X) + STATUS(ID, ST_WIDTH)
y = STATUS(ID, ST_Y)

// 左下
x = STATUS(ID, ST_X)
y = STATUS(ID, ST_Y) + STATUS(ID, ST_HEIGHT)

// 右下
x = STATUS(ID, ST_X) + STATUS(ID, ST_WIDTH)
y = STATUS(ID, ST_Y) + STATUS(ID, ST_HEIGHT)

親ウィンドウ・子ウィンドウ

.png
ST_PARENT
親ウィンドウのIDを返します。ウィンドウからウィンドウを開いたとき新しく開いた方のウィンドウを子ウィンドウ、元のウィンドウを親ウィンドウといいます。画像のOptionのウィンドウから見たUWSC Debuggerが親ウィンドウとなります。

状態

ST_ICON
アイコン状態を示すブール値を返します。
ST_MAXIMIZED
最大化状態を示すブール値を返します。
ST_VISIBLE
可視状態を示すブール値を返します。可視状態であれば最小化しててもTrueを返します。
ST_ACTIVE
アクティブ状態を示すブール値を返します。アクティブ状態とは利用者が文字入力などの操作を行える状態にある、最前面に表示されているウィンドウのことをいいます。
ST_BUSY
ビジー状態を示すブール値を返します。ビジー状態とは負荷のかかる処理を行っていてユーザーの操作に対応できない状態のことを指します。マウスカーソルの種別が待ち状態(青い輪でくるくるしてる状態)がビジー状態です。

ウィンドウのID

ST_ISID
UWSCで利用できるIDであるかを示すブール値を返します。

有効なIDは以下のプログラムで取得できます。以下の結果に出てくるIDはTrue、出てこない値はFalseを返します。

UWSC
FOR ID IN GETALLWIN()
	PRINT ID
NEXT

64bitアプリ

64bit.png
ST_WIN64
64bitアプリかを示すブール値を返します。64bitアプリかはタスクマネージャーのプロセスで確認することができます。アプリ名の後ろに(32ビット)と書かれているものは32bitアプリ、書かれていないものは64bitアプリとなります。

実行ファイルの場所

実行ファイルの場所.png
ST_PATH
アプリケーションの実行ファイルの場所(パス)を返します。実行ファイルの場所は、タスクマネージャーのアプリ名を右クリックメニューの[ファイルの場所を開く]で開いたときに選択されているアプリのパスと同じです。

プロセスID

プロセスID.png
ST_PROCESS
プロセスIDを返します。この値はタスクマネージャー詳細タブのPIDの値に等しいです。

モニタ番号

ST_MONITOR
表示されているモニタ番号を返します。

プログラム実行例

表示されているすべてのウィンドウのスクリーンショットを保存

UWSC
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")

DIM folderspec = "D:\Desktop\Screenshot"
IF FSO.FolderExists(folderspec) = FALSE THEN FSO.CreateFolder(folderspec)

FOR n = 0 TO GETALLWIN() - 1
	DIM ID = ALL_WIN_ID[n]
	IFB STATUS(ID, ST_VISIBLE) = TRUE		
		DIM filename = ID + "_" + STATUS(ID, ST_TITLE)
		filename = PathCleanupSpec(filename)
		DIM path = FSO.BuildPath(folderspec, filename)
		path = uniqueFilename(path)
		SAVEIMG(path, id)
	ENDIF
NEXT

//////////////////////////////////////////////////
// 【引数】
//   filename : 使えない文字を削除するファイル・フォルダ名 
// 【戻り値】
//   ファイル名として使えない文字を削除した文字列 
//////////////////////////////////////////////////
FUNCTION PathCleanupSpec(filename)
	DIM filenameErrChar[12] = "\", "/", ":", "*", "?", "<#DBL>", "<#CR>", "<#TAB>", "<", ">", "|", "[", "]"
	FOR item IN filenameErrChar
		filename = REPLACE(filename, item, "")
	NEXT
	RESULT = filename
FEND

//////////////////////////////////////////////////
// 【引数】
//   path : ファイルのパス 
// 【戻り値】
//   重複しないファイル名 
//////////////////////////////////////////////////
FUNCTION uniqueFilename(path)
	DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
	IFB FSO.FileExists(path) THEN
		DIM fol = FSO.GetParentFolderName(path)
		DIM filename = FSO.GetBaseName(path)
		DIM extension = FSO.GetExtensionName(path)
		DIM i = 2
		WHILE FSO.FileExists(FSO.BuildPath(fol, filename + " (" + i + ")." + extension))
			i = i + 1
		WEND
		RESULT = FSO.BuildPath(fol, filename + " (" + i + ")." + extension)
	ELSE
		RESULT = path
	ENDIF
FEND
使用関数
解説

タスクバーの位置を取得する

UWSC
DIM ID = GETID("", "Shell_TrayWnd")

SELECT TRUE
	CASE STATUS(ID, ST_X) = 0 AND STATUS(ID, ST_Y) = 0 AND STATUS(ID, ST_CLWIDTH) = G_SCREEN_W
		PRINT "上"
	CASE STATUS(ID, ST_X) = 0 AND STATUS(ID, ST_Y) = 0 AND STATUS(ID, ST_CLHEIGHT) = G_SCREEN_H
		PRINT "左"
	CASE STATUS(ID, ST_X) = 0 AND STATUS(ID, ST_Y) <> 0 AND STATUS(ID, ST_CLWIDTH) = G_SCREEN_W
		PRINT "下"
	CASE STATUS(ID, ST_X) <> 0 AND STATUS(ID, ST_Y) = 0 AND STATUS(ID, ST_CLHEIGHT) = G_SCREEN_H
		PRINT "右"
SELEND
使用関数
解説

マウスカーソル下のウィンドウの情報を吹き出しに表示

UWSC
PUBLIC ttl, cls

SETHOTKEY(VK_ESC, , "forceQuit")
SETHOTKEY(VK_S, MOD_ALT, "output")

WHILE TRUE
	ID = GETID(GET_FROMPOINT_WIN)
	msg = ""
	msg = msg + "ALT+Sでカーソル下のタイトルとクラス名を出力<#CR>"
	msg = msg + "ESCで終了<#CR>"
	msg = msg + "<#CR>"
	ttl = STATUS(ID, ST_TITLE)
	cls = STATUS(ID, ST_CLASS)
	msg = msg + "タイトル:" + ttl + "<#CR>"
	msg = msg + "クラス名:" + cls + "<#CR>"
	msg = msg + "X座標:" + STATUS(ID, ST_X) + "<#CR>"
	msg = msg + "Y座標:" + STATUS(ID, ST_Y) + "<#CR>"
	msg = msg + "幅:" + STATUS(ID, ST_WIDTH) + "<#CR>"
	msg = msg + "高さ:" + STATUS(ID, ST_HEIGHT) + "<#CR>"
	msg = msg + "クライアントX座標:" + STATUS(ID, ST_CLX) + "<#CR>"
	msg = msg + "クライアントY座標:" + STATUS(ID, ST_CLY) + "<#CR>"
	msg = msg + "クライアント幅:" + STATUS(ID, ST_CLWIDTH) + "<#CR>"
	msg = msg + "クライアント高さ:" + STATUS(ID, ST_CLHEIGHT) + "<#CR>"
	msg = msg + "親ウィンドウID:" + STATUS(ID, ST_PARENT) + "<#CR>"
	msg = msg + "アイコン状態:" + STATUS(ID, ST_ICON) + "<#CR>"
	msg = msg + "最大化:" + STATUS(ID, ST_MAXIMIZED) + "<#CR>"
	msg = msg + "表示状態:" + STATUS(ID, ST_VISIBLE) + "<#CR>"
	msg = msg + "アクティブ状態:" + STATUS(ID, ST_ACTIVE) + "<#CR>"
	msg = msg + "ビジー状態:" + STATUS(ID, ST_BUSY) + "<#CR>"
	msg = msg + "有効ID:" + STATUS(ID, ST_ISID) + "<#CR>"
	msg = msg + "64bit:" + STATUS(ID, ST_WIN64) + "<#CR>"
	msg = msg + "EXEパス:" + STATUS(ID, ST_PATH) + "<#CR>"
	msg = msg + "プロセスID:" + STATUS(ID, ST_PROCESS) + "<#CR>"
	msg = msg + "モニター番号:" + STATUS(ID, ST_MONITOR) + "<#CR>"
	FUKIDASI(msg)
	SLEEP(0.01)
WEND

// 強制終了する
PROCEDURE forceQuit()
	EXITEXIT
FEND

// カーソル下のウィンドウのタイトルとクラス名を出力
PROCEDURE output()
	PRINT "GETID(<#DBL>" + ttl + "<#DBL>, <#DBL>" + cls + "<#DBL>)"
	PRINT ttl
	PRINT cls
	PRINT "----------"
FEND
使用関数

マウスカーソル下の文字情報を取得

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	DIM ID = GETID(GET_FROMPOINT_WIN)
	FUKIDASI(POSACC(ID, G_MOUSE_X - STATUS(ID, ST_CLX), G_MOUSE_Y - STATUS(ID, ST_CLY), ACC_BACK))
	SLEEP(0.001)
WEND

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND

ファイルを開いているプロセスを調べる

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

CONST TemporaryFolder = 2

DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")

WITH FSO
	DIM Folder = .GetSpecialFolder(TemporaryFolder)
	DIM folderspec = Folder.Path
	DIM filename = .GetTempName
	DIM path = .BuildPath(folderspec, filename)
ENDWITH

DIM Shell = CREATEOLEOBJ("Shell.Application")
Shell.FileRun()

DIM ID = GETID("ファイル名を指定して実行", "#32770")

SENDSTR(ID, "cmd /c openfiles /query /fo CSV > " + path)
CLKITEM(ID, "OK", CLK_BTN)
SLEEP(0.500)

REPEAT
	SLEEP(0.100)
UNTIL GETID("C:\WINDOWS\system32\cmd.exe", "ConsoleWindowClass") = -1

DIM FID = FOPEN(path, F_READ)

TRY
	DIM ID2 = GETID("使用中", "OperationStatusWindow")

	GETITEM(ID2, ITM_ACCTXT, 1)
	DIM str = ALL_ITEM_LIST[1]
	
	DIM sep = IIF(POS("フォルダー", STATUS(ID2, ST_TITLE)) <> 0, "\", "")
	DIM msg = "■" + str + "<#CR>"
	
	FOR r = 5 TO FGET(FID, F_LINECOUNT)
		IF POS("\" + str + sep,  FGET(FID, r, 3)) <> 0 THEN
			msg = msg + "ID:" + FGET(FID, r, 1) + ", プロセス名:" + FGET(FID, r, 2) + "<#CR>"
		ENDIF
	NEXT
	FCLOSE(FID)

	REPEAT
		FUKIDASI(TRIM(msg))
		SLEEP(0.100)
	UNTIL GETID("使用中", "OperationStatusWindow") = -1
FINALLY
	FSO.DeleteFile(path)
ENDTRY

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻り値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND
使用関数
解説

アクティブウィンドウの左上にカーソルを移動

UWSC
DIM ID = GETID(GET_ACTIVE_WIN)

DIM x = STATUS(ID, ST_X)
DIM y = STATUS(ID, ST_Y)

MMV(x, y)
使用関数
解説

最前面にあるウィンドウのタイトルを吹き出しに表示

UWSC
DEF_DLL GetForegroundWindow(): long: user32.dll

WHILE TRUE
	FUKIDASI(STATUS(HNDTOID(GetForegroundWindow()), ST_TITLE))
	SLEEP(0.001)
WEND

カーソル位置の文章を取得

UWSC
DIM arr[-1]
 
FOR n = 0 TO GETALLWIN() - 1
	arrayPush(arr, ALL_WIN_ID[n])
NEXT
 
arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)")
arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr)
 
QSORT(arr, QSRT_A)
 
TRY
	DIM Word = GETACTIVEOLEOBJ("Word.Application")
EXCEPT
	MSGBOX("操作する文書を開いてださい。")
	EXIT
ENDTRY
 
DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr)
 
IFB res = -1 THEN
	MSGBOX("ファイル名が選択されなかったので終了します。")
	EXIT
ENDIF

PRINT Word.Selection.Sentences(1).Text

//////////////////////////////////////////////////
// 【引数】
//   array : 一次元配列。参照引数。 
//   callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 
// 【戻り値】
//   callback関数によりフィルタ処理が行われたarrayの全ての要素を含む配列を返します。 
//////////////////////////////////////////////////
PROCEDURE arrayFilter(var array[], callback)
	DIM n = 0
	DIM tmp[-1]
	FOR %val% IN array
		IFB EVAL(callback) THEN
			RESIZE(tmp, n)
			tmp[n] = %val%
			n = n + 1
		ENDIF
	NEXT
	RESIZE(array, RESIZE(tmp))
	FOR n = 0 TO RESIZE(tmp)
		array[n] = tmp[n]
	NEXT
FEND

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
使用関数

CLKITEMで操作できる項目を取得

UWSC
PUBLIC flg = FALSE

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_X, MOD_ALT, "flag")

DIM array[] = "BTN", "LIST", "TAB", "MENU", "TREEVIEW", + _
				"LISTVIEW", "EDIT", "STATIC", "STATUSBAR", "TOOLBAR", + _
				"LINK", "ACCCLK", "ACCCLK2", "ACCTXT", "ACCEDIT", + _
				"FROMLAST", "BACK"

REPEAT
	FUKIDASI("Alt + Xでカーソル下の情報を取得")
	SLEEP(0.001)
UNTIL flg

FUKIDASI("取得中")

DIM ID = GETID(GET_FROMPOINT_WIN)

PRINT "DIM ID = GETID(<#DBL>" + STATUS(ID, ST_TITLE) + "<#DBL>, <#DBL>" + STATUS(ID, ST_CLASS) + "<#DBL>)"
PRINT

FOR item IN array
	PRINT "// [" + item + "]" 
	FOR class IN GETITEM(ID, EVAL("ITM_" + item), -1)
		PRINT "CLKITEM(ID, <#DBL>" + class + "<#DBL>, CLK_" + item + ")"
	NEXT
	PRINT
NEXT

PROCEDURE forceQuit()
	EXITEXIT
FEND

PROCEDURE flag()
	flg = TRUE
FEND
解説

関連記事

ACW関数 (スクリプト関数)
指定したIDのウィンドウの位置・サイズを変更します。IDのみを指定した場合、そのウィンドウをアクティブにします。
MONITOR関数 (スクリプト関数)
MONITOR関数は、指定したモニタ番号・取得項目の情報を取得します。取得項目には、X座標・Y座標・幅・高さ・モニター名があります。引数なしの場合はモニターの数を返します。
EXEC関数 (スクリプト関数)
EXECは、第一引数に指定したアプリを起動する関数です。そのウィンドウのIDを戻値として返します。ストアアプリ・エクスプローラなどの別プロセスを呼ぶアプリはIDを返さないことがあるので、起動した後にGETIDで取得します。
GETID関数 (スクリプト関数)
指定したウィンドウのIDを取得します。第一引数に取得したいウィンドウのタイトル(一部でも可)を指定します。UWSCでウィンドウを操作するのによく使う関数です。
PEEKCOLOR関数 (スクリプト関数)
PEEKCOLOR関数は、指定座標の色を取得する関数です。
MOUSEORG関数 (スクリプト関数)
マウス座標を相対座標にする、 またはマウスとキー情報を直接ウィンドウへ送ります。
getBitmap関数 (自作関数)
引数に指定したビットマップ画像のサイズ・幅・高さ・ビットの深さを配列で返します。
GETCTLHND関数 (スクリプト関数)
ボタン等、オブジェクトのハンドルを取得します。
CHKIMG関数 (スクリプト関数)
指定画像が画面上にあるかチェックしあればその情報を返します。
CTRLWIN関数 (スクリプト関数)
ウィンドウの状態を操作します。ウィンドウを終了、アクティブ化、表示・非表示、最大化・最小化などができます。