SETHOTKEY

構文
  1. Boolean = SETHOTKEY( キーコード, [修飾子キー, Procedure名] )
引数
キーコード
使用するキーコード
修飾子キー
(省略可、複数指定化)
MOD_ALT(Alt)
MOD_CONTROL(Ctrl)
MOD_SHIFT(Shift)
MOD_WIN(Win)
Procedure名
UWSC側の呼び出される Procedure名、省略された場合にはホットキーの解除
戻値
TRUE
成功
FALSE
失敗

Procedure内にて変数 HOTKEY_VK にキーコード、 HOTKEY_MOD に修飾子キーが格納されている。

プログラム実行例

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

HASHTBL NAME

NAME[ITM_BTN] = "ITM_BTN"
NAME[ITM_LIST] = "ITM_LIST"
NAME[ITM_TAB] = "ITM_TAB"
NAME[ITM_MENU] = "ITM_MENU"
NAME[ITM_TREEVIEW] = "ITM_TREEVIEW"
NAME[ITM_LISTVIEW] = "ITM_LISTVIEW"
NAME[ITM_EDIT] = "ITM_EDIT"
NAME[ITM_STATIC] = "ITM_STATIC"
NAME[ITM_STATUSBAR] = "ITM_STATUSBAR"
NAME[ITM_TOOLBAR] = "ITM_TOOLBAR"
NAME[ITM_LINK] = "ITM_LINK"
NAME[ITM_ACCCLK] = "ITM_ACCCLK"
NAME[ITM_ACCCLK2] = "ITM_ACCCLK2"
NAME[ITM_ACCTXT] = "ITM_ACCTXT"
NAME[ITM_ACCEDIT] = "ITM_ACCEDIT"
NAME[ITM_FROMLAST] = "ITM_FROMLAST"

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	FUKIDASI("ALT+Sでカーソル下の情報を取得します<#CR>ESCで終了")
	IF GETKEYSTATE(VK_ALT) AND GETKEYSTATE(VK_S) THEN BREAK
WEND
FUKIDASI("取得中")

DIM ID = GETID(GET_FROMPOINT_WIN)

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

DIM items[] = ITM_BTN, ITM_LIST, ITM_TAB, ITM_MENU, ITM_TREEVIEW, ITM_LISTVIEW, ITM_EDIT, ITM_STATIC, ITM_STATUSBAR, ITM_TOOLBAR, ITM_LINK, ITM_ACCCLK, ITM_ACCCLK2, ITM_ACCTXT, ITM_ACCEDIT, ITM_FROMLAST

FOR item IN items
	PRINT "// [" + NAME[item] + "]"
	FOR arr IN GETITEM(ID, item)
		PRINT "CLKITEM(ID, <#DBL>" + arr + "<#DBL>, " + NAME[item] + ")"
	NEXT
	PRINT
NEXT

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. SETHOTKEY
  2. FUKIDASI
  3. GETKEYSTATE
  4. GETID
  5. STATUS
  6. GETITEM
解説
  1. 1行目
    HASHTBL NAME
    
    連想配列NAMEを宣言。
  2. 3-18行目
    NAME[ITM_BTN] = "ITM_BTN"
    NAME[ITM_LIST] = "ITM_LIST"
    NAME[ITM_TAB] = "ITM_TAB"
    NAME[ITM_MENU] = "ITM_MENU"
    NAME[ITM_TREEVIEW] = "ITM_TREEVIEW"
    NAME[ITM_LISTVIEW] = "ITM_LISTVIEW"
    NAME[ITM_EDIT] = "ITM_EDIT"
    NAME[ITM_STATIC] = "ITM_STATIC"
    NAME[ITM_STATUSBAR] = "ITM_STATUSBAR"
    NAME[ITM_TOOLBAR] = "ITM_TOOLBAR"
    NAME[ITM_LINK] = "ITM_LINK"
    NAME[ITM_ACCCLK] = "ITM_ACCCLK"
    NAME[ITM_ACCCLK2] = "ITM_ACCCLK2"
    NAME[ITM_ACCTXT] = "ITM_ACCTXT"
    NAME[ITM_ACCEDIT] = "ITM_ACCEDIT"
    NAME[ITM_FROMLAST] = "ITM_FROMLAST"
    
  3. 20行目
    SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
    
    ESCキーでforceQuit関数を実行。
  4. 22-25行目
    WHILE TRUE
    	FUKIDASI("ALT+Sでカーソル下の情報を取得します<#CR>ESCで終了")
    	IF GETKEYSTATE(VK_ALT) AND GETKEYSTATE(VK_S) THEN BREAK
    WEND
    
    「ALT+S」が入力されるのを待つ。
  5. 26行目
    FUKIDASI("取得中")
    
    吹き出しを表示。
  6. 28行目
    DIM ID = GETID(GET_FROMPOINT_WIN)
    
    マウスカーソル下のウィンドウのIDを取得。
  7. 33行目
    DIM items[] = ITM_BTN, ITM_LIST, ITM_TAB, ITM_MENU, ITM_TREEVIEW, ITM_LISTVIEW, ITM_EDIT, ITM_STATIC, ITM_STATUSBAR, ITM_TOOLBAR, ITM_LINK, ITM_ACCCLK, ITM_ACCCLK2, ITM_ACCTXT, ITM_ACCEDIT, ITM_FROMLAST
    
  8. 35-41行目
    FOR item IN items
    	PRINT "// [" + NAME[item] + "]"
    	FOR arr IN GETITEM(ID, item)
    		PRINT "CLKITEM(ID, <#DBL>" + arr + "<#DBL>, " + NAME[item] + ")"
    	NEXT
    	PRINT
    NEXT
    

画像をクリップボードにコピーする

Alt+Sでマウスカーソル下のオブジェクトのスクリーンショット画像をクリップボードにコピーします。

SETHOTKEY(VK_S, MOD_ALT, "imageToClipboard")
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	SLEEP(0.01)
WEND

PROCEDURE imageToClipboard()
	SAVEIMG( , GETID(GET_FROMPOINT_WIN))
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. SETHOTKEY
  2. SLEEP
  3. SAVEIMG
  4. GETID
解説
  1. 1行目
    SETHOTKEY(VK_S, MOD_ALT, "imageToClipboard")
    
    Alt+SでimageToClipboard関数を実行します。
  2. 2行目
    SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
    
    EscでforceQuit関数を実行します。
  3. 4-6行目
    WHILE TRUE
    	SLEEP(0.01)
    WEND
    
    無限ループ。Alt+SもしくはEscが入力されるのを待機します。

アイドル時間を取得

DEF_DLL GetTickCount(): Dword: kernel32
DEF_DLL GetLastInputInfo({DWORD, DWORD}): BOOL: user32
DIM t

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	GetLastInputInfo(8, t)
	FUKIDASI((GetTickCount() - t) + "ms")
	SLEEP(0.01)
WEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. SETHOTKEY
  2. FUKIDASI
  3. SLEEP

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

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
  1. SETHOTKEY
  2. GETID
  3. STATUS
  4. FUKIDASI
  5. SLEEP

プログラム実行時からの経過時間を表示(ESCで終了)

SETHOTKEY(VK_ESC, , "forceQuit")

DIM t = GETTIME()

WHILE TRUE
	FUKIDASI(GETTIME() - t)
	SLEEP(0.001)
WEND

PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. sethotkey
  2. gettime
  3. fukidasi
  4. sleep

メールを受信したらメッセージボックスを表示する。

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit") 

DIM Outlook = GETACTIVEOLEOBJ("Outlook.Application")
OLEEVENT(Outlook, "ApplicationEvents_11", "NewMailEx", "receivedMail")

WHILE TRUE
	FUKIDASI("ESCで終了")
	SLEEP(60.000)
WEND

PROCEDURE forceQuit()
	EXITEXIT
FEND

PROCEDURE receivedMail()
	MSGBOX("メールを受信しました")
FEND
  1. SETHOTKEY
  2. GETACTIVEOLEOBJ
  3. OLEEVENT
  4. FUKIDASI
  5. SLEEP

マウスカーソル下のスクロールバー情報を取得

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	DIM ID = GETID(GET_FROMPOINT_WIN)
	DIM str = ""
	DIM i = 1
	WHILE GETSLIDER(ID, i, SLD_POS) <> ERR_VALUE
		str = str + "[" + i + "]<#CR>"
		str = str + "値:" + GETSLIDER(ID, i, SLD_POS) + "<#CR>"
		str = str + "最小値:" + GETSLIDER(ID, i, SLD_MIN) + "<#TAB>"
		str = str + "最大値:" + GETSLIDER(ID, i, SLD_MAX) + "<#CR>"
		str = str + "移動量:" + GETSLIDER(ID, i, SLD_PAGE) + "<#TAB>"
		str = str + "表示方向:" + GETSLIDER(ID, i, SLD_BAR) + "<#CR>"
		str = str + "X座標:" + GETSLIDER(ID, i, SLD_X) + "<#TAB>"
		str = str + "Y座標:" + GETSLIDER(ID, i, SLD_Y) + "<#CR>"
		str = str + "----------<#CR>"
		i = i + 1
	WEND
	FUKIDASI(TRIM(str))
WEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. SETHOTKEY
  2. GETID
  3. GETSLIDER
  4. FUKIDASI
結果

[1]
値:28
最小値:0 最大値:65
移動量:12 表示方向:1
X座標:0 Y座標:56
----------
[2]
値:0
最小値:0 最大値:15
移動量:11 表示方向:1
X座標:393 Y座標:56
----------
[3]
値:17
最小値:0 最大値:486
移動量:450 表示方向:0
X座標:393 Y座標:56
----------
[4]
値:59
最小値:0 最大値:63
移動量:5 表示方向:1
X座標:0 Y座標:330
----------

Yahoo!ファイナンスから米ドル・ユーロ・豪ドルのレートを取得

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.Navigate("https://info.finance.yahoo.co.jp/fx/")
BusyWait(IE)

// ループを抜ける用のフラグ
PUBLIC flg = FALSE

// ESCキーを入力でloopBreak関数を実行
SETHOTKEY(VK_ESC, , "loopBreak")

REPEAT
	usd = IE.document.getElementById("USDJPY_top_bid").innerText
	eur = IE.document.getElementById("EURJPY_top_bid").innerText
	aud = IE.document.getElementById("AUDJPY_top_bid").innerText
	msg = "米ドル/円<#TAB>" + usd + "<#CR>" + _
			"ユーロ/円<#TAB>" + eur + "<#CR>" + _
			"豪ドル/円<#TAB>" + aud + "<#CR>" + _
			"ESCで終了"
	FUKIDASI(msg)
	SLEEP(0.01)
UNTIL flg = TRUE

IE.Quit

PROCEDURE loopBreak()
	flg = TRUE
FEND

//////////////////////////////////////////////////
// 【引数】
//   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

//////////////////////////////////////////////////
// 【引数】
//   文字列 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 < 0
					FOR n = Shell.Windows.Count - 1 TO 0 STEP -1
						TRY
							IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
								cnt = cnt + 1
								IFB ABS(str) = cnt THEN
									RESULT = Shell.Windows.Item(n)
									EXIT
								ENDIF
							ENDIF
						EXCEPT
						ENDTRY
					NEXT
				CASE str = 0
					FOR n = 0 TO Shell.Windows.Count - 1
						TRY
							IF Shell.Windows.Item(n).Name = "Internet Explorer" THEN cnt = cnt + 1
						EXCEPT
						ENDTRY
					NEXT
					RESULT = cnt
					EXIT
			SELEND
		CASE FALSE
			DIM t = GETTIME()
			REPEAT
				FOR n = 0 TO Shell.Windows.Count - 1
					TRY
						DIM targetObj = Shell.Windows.Item(n)
						IFB targetObj.Name = "Internet Explorer" THEN
							SELECT flg
								CASE TRUE
									IFB targetObj.document.title = str OR targetObj.LocationURL = str THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
								CASE FALSE
									IFB POS(str, targetObj.document.title) OR POS(str, targetObj.LocationURL) THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
							SELEND
						ENDIF
					EXCEPT
					ENDTRY
				NEXT
			UNTIL GETTIME() - t >= 5
	SELEND
	RESULT = ERR_VALUE
FEND
  1. CREATEOLEOBJ
  2. IE.Visible
  3. IE.Navigate
  4. SETHOTKEY
  5. IE.document
  6. Document.getElementById
  7. Node.innerText
  8. FUKIDASI
  9. IE.Quit

マウス位置の色を取得

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

WHILE TRUE
	DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
	DIM r = c AND $FF
	DIM g = (c AND $FF00) / $100
	DIM b = (c AND $FF0000) / $10000
	FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
	SLEEP(0.001)
WEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. SETHOTKEY
  2. PEEKCOLOR
  3. FUKIDASI
  4. SLEEP
解説
  1. 1行目
    SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
    
    ホットキーを設定する。ESCキーでforceQuit関数を呼び出す。
  2. 3行目
    WHILE TRUE
    
    無限ループ開始。
  3. 4行目
    	DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
    
    マウス位置のBGR値を取得。例)c = 16513269 = 0xFBF8F5 = 11111011 11111000 11110101b。
    c = 16513269BGR
    16進数FBF8F5
    2進数111110111111100011110101
  4. 5行目
    	DIM r = c AND $FF
    
    BGR値からR成分を取得。F5が返ります。
    BGR
    c111110111111100011110101
    $FF11111111
    c AND $FF11110101
  5. 6行目
    	DIM g = (c AND $FF00) / $100
    
    BGR値からG成分を取得。F8が返ります。
    BGR
    c111110111111100011110101
    $FF001111111100000000
    c AND $FF001111100000000000
  6. 7行目
    	DIM b = (c AND $FF0000) / $10000
    
    BGR値からB成分を取得。FBが返ります。
    BGR
    c111110111111100011110101
    $FF0000111111110000000000000000
    c AND $FF0000111110110000000000000000
  7. 8行目
    	FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
    
    各成分を吹き出しに表示。