FUKIDASI

FUKIDASI関数は、メッセージを吹出しに表示する関数です。MSGBOX関数と違い処理を中断することがありません。

引数を省略すると吹き出しを消すことができます。

構文
FUKIDASI( メッセージ, [x, y, 向き, フォントサイズ, フォント名, 文字色, 背景色, 透明化] )
引数
メッセージ
表示メッセージ
x, y
位置
向き
0
嘴なし
1
上嘴
2
下嘴
3
左嘴
4
右嘴
フォントサイズ
文字フォントサイズ
フォント名
フォント名
文字色
BGR値にて指定
背景色
BGR値にて指定
透明化
0〜255
不透明〜透明
-1
バックを透明化
-2
外枠も非表示
戻値

座標

第二引数・第三引数で指定する座標は嘴も含めた吹き出しの左上の座標になります。

吹き出しの幅・高さを取得するにはGETIDのGET_FUKIDASI_WINを使います。

DIM ID = GETID(GET_FUKIDASI_WIN)
PRINT STATUS(ID, ST_WIDTH)
PRINT STATUS(ID, ST_HEIGHT)

向き

背景色

デフォルトの背景色は【黄色】(B, G, R) = (0, 255, 255)です。

$000000(黒)を指定するとなぜか$FFFF00(デフォルトの黄色)になる。

透明化

以下は背景を透明化した吹き出し。

色付き背景で動かしたら透明なのわかりやすいかな。

プログラム実行例

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. script.function.SETHOTKEY(20)
  2. script.function.FUKIDASI(23,26)
  3. script.function.GETKEYSTATE(24)
  4. script.function.GETID(28)
  5. script.function.STATUS(30)
  6. script.function.GETITEM(37)
解説
  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
    
-PR-

指定日時までのカウントダウンタイマー

DIM date = dateAdd("d", 1, today())
DIM targetTime = GETTIME(0, date + " 00:00:00")

REPEAT
	DIM remainingTime = targetTime - GETTIME()
	FUKIDASI(remainingTime + "秒")
	SLEEP(0.001)
UNTIL remainingTime <= 0

MSGBOX("0時になりました。")

//////////////////////////////////////////////////
// 【引数】
//   interval : 加算する時間間隔を表す文字列式(yyyy:年、m:月、d:日、ww:週、h:時、n:分、s:秒) 
//   num : dateに加算する値。未来は正、過去は負で指定 
//   date : 時間間隔を加算する日付 
// 【戻値】
//   日時(date)に、指定した単位(interval)の時間(num)を加算して返します 
//////////////////////////////////////////////////
FUNCTION dateAdd(interval, num, date)
	DIM year, month, day, d
	GETTIME(0, date)
	SELECT interval
		CASE "yyyy"
			d = (G_TIME_YY + num) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
		CASE "m"
			IFB num > 0 THEN
				year = G_TIME_YY + INT((G_TIME_MM + num) / 12)
				month = REPLACE(FORMAT(((G_TIME_MM + num) MOD 12), 2), " ", "0")
			ELSE
				year = G_TIME_YY + CEIL((G_TIME_MM + num) / 12 - 1)
				month = REPLACE(FORMAT(G_TIME_MM - (ABS(num) MOD 12), 2), " ", "0")
			ENDIF
			IF month = "00" THEN month = 12
			day = G_TIME_DD2
			d = "" + year + month + day
			IFB !isDate(d) THEN
				d = year + "/" + month + "/" + "01"
				d = getEndOfMonth(d)
			ELSE
				d = year + "/" + month + "/" + day
			ENDIF
		CASE "d"
			t = GETTIME(num, date)
			d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
		CASE "ww"
			t = GETTIME(num * 7, date)
			d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
		CASE "h"
			t = GETTIME(num / 24, date)
			d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
		CASE "n"
			t = GETTIME(num / 1440, date)
			d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
		CASE "s"
			t = GETTIME(num / 86400, date)
			d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
	SELEND
	RESULT = d
FEND

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
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

//////////////////////////////////////////////////
// 【引数】
//   日付 : YYYYMMDD 
// 【戻値】
//   TRUE : 日付として認識できる、FALSE : 日付として認識できない 
//////////////////////////////////////////////////
FUNCTION isDate(date)
	DIM Pattern = "^(?!([02468][1235679]|[13579][01345789])000229)(([0-9]{4}(01|03|05|07|08|10|12)(0[1-9]|[12][0-9]|3[01]))|([0-9]{4}(04|06|09|11)(0[1-9]|[12][0-9]|30))|([0-9]{4}02(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}([02468][048]|[13579][26])0229))$"
	DIM Match = reExecute(date, Pattern)
	RESULT = IIF(Match.Count <> 0, TRUE, FALSE)
FEND

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.dateAdd(1)
  2. udf.today(1)
  3. script.function.GETTIME(2,5)
  4. script.syntax.control.repeat-until(4)
  5. script.function.FUKIDASI(6)
  6. script.function.SLEEP(7)
  7. script.function.MSGBOX(10)

アイドル時間を取得

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. script.function.SETHOTKEY(5)
  2. script.function.FUKIDASI(9)
  3. script.function.SLEEP(10)

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

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. script.function.SETHOTKEY(3,4)
  2. script.function.GETID(7)
  3. script.function.STATUS(12,13,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34)
  4. script.function.FUKIDASI(35)
  5. script.function.SLEEP(36)

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

SETHOTKEY(VK_ESC, , "forceQuit")

DIM t = GETTIME()

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

PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. script.function.sethotkey(1)
  2. script.function.gettime(Α,6])
  3. script.function.fukidasi(6)
  4. script.function.sleep(7)

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

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

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

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. script.function.GETID(4)
  2. script.function.FUKIDASI(5)
  3. script.function.POSACC(5)
  4. script.function.STATUS(5)

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

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. script.function.SETHOTKEY(1)
  2. script.function.GETACTIVEOLEOBJ(3)
  3. script.function.OLEEVENT(4)
  4. script.function.FUKIDASI(7)
  5. script.function.SLEEP(8)

カーソル座標と色情報を取得

HASHTBL rgb

WHILE TRUE
	DIM x = G_MOUSE_X
	DIM y = G_MOUSE_Y
	DIM c = PEEKCOLOR(x, y)
	rgb["r"] = decToHex(c AND $FF)
	rgb["g"] = decToHex((c AND $FF00) / $100)
	rgb["b"] = decToHex((c AND $FF0000) / $10000)	
	IF LENGTH(rgb["r"]) = 1 THEN rgb["r"] = "0" + rgb["r"]
	IF LENGTH(rgb["g"]) = 1 THEN rgb["g"] = "0" + rgb["g"]
	IF LENGTH(rgb["b"]) = 1 THEN rgb["b"] = "0" + rgb["b"]
	c = "" + rgb["b"] + rgb["g"] + rgb["r"]
	font = "$" + invertedColor(c)
	back = IIF("$" + c = "$000000", "$000001", "$" + c)		// $000000は$FFFF00になるので$000001
	msg = "(x, y)<#TAB>(" + x + ", " + y + ")<#CR>" + _
				"赤<#TAB>" + rgb["r"] + "(" + hexToDec(rgb["r"]) + ")" + "<#CR>" + _
				"緑<#TAB>" + rgb["g"] + "(" + hexToDec(rgb["g"]) + ")" + "<#CR>" + _
				"青<#TAB>" + rgb["b"] + "(" + hexToDec(rgb["b"]) + ")"
	DIM ID = GETID(GET_FUKIDASI_WIN)
	DIM ofs = 25
	fx = x + IIF(x >= G_SCREEN_W / 2, -1 * (STATUS(ID, ST_WIDTH) + ofs), ofs)
	fy = y - STATUS(ID, ST_HEIGHT) * (y / G_SCREEN_H)
	FUKIDASI(msg, fx, fy, IIF(x >= G_SCREEN_W / 2, 4, 3), 10, "メイリオ", font, back)
	SLEEP(0.001)
WEND

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   dec : 10進数 
// 【戻値】
//   16進数に変換した値 
//////////////////////////////////////////////////
FUNCTION decToHex(dec)
	RESULT = FORMAT(VAL(dec), 0, -1)
FEND

//////////////////////////////////////////////////
// 【引数】
//   hex : 16進数 
// 【戻値】
//   10進数に変換した値 
//////////////////////////////////////////////////
FUNCTION hexToDec(hex)
	dec = 0
	hex = STRCONV(hex, SC_LOWERCASE)
	FOR n = 1 TO LENGTH(hex)
		str = COPY(hex, n, 1)
		IFB CHKNUM(str) THEN
			num = str
		ELSE
			num = ASC(str) - 87
		ENDIF
		dec = dec + (num * POWER(16, LENGTH(hex) - n))
	NEXT
	RESULT = dec
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

//////////////////////////////////////////////////
// 【引数】
//   color 
// 【戻値】
// 
//////////////////////////////////////////////////
FUNCTION invertedColor(color)
	DIM array = strSplit(color, 2)
	FOR i = 0 TO UBound(array)
		array[i] = decToHex($FF - hexToDec(array[i]))
	NEXT
	RESULT = JOIN(array, "")
FEND

//////////////////////////////////////////////////
// 【引数】
//   string : 分割する文字列 
//   length : 各要素の最大長 
// 【戻値】
// 
//////////////////////////////////////////////////
FUNCTION strSplit(string, length = 1)
	DIM array[-1]
	WHILE LENGTH(string)
		arrayPush(array, COPY(string, 1, length))
		string = COPY(string, length + 1)
	WEND
	RESULT = SLICE(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. script.function.PEEKCOLOR(6)
  2. script.function.FUKIDASI(24)
結果

画像ファイルの情報を取得

「ピクチャ\100ANDRO\20210314」にある画像ファイルの情報を出力。

CONST ssfMYPICTURES = 39

HASHTBL iColumn

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfMYPICTURES)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM path = FSO.BuildPath(Folder.Self.Path, "100ANDRO\20210314")
Folder = Shell.NameSpace(path)
FolderItems = Folder.Items

FOR n = 0 TO 350
	iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n
NEXT

DIM temp = uniqueFilename(FSO.BuildPath(path, "Info.csv"))
FSO.CreateTextFile(temp, FALSE, FALSE)

DIM FID = FOPEN(temp, F_READ OR F_WRITE)

DIM array[] = "ファイル名", "撮影日時", "幅", "高さ", "サイズ", "ビットの深さ", "パス", "焦点距離", "向き"

FOR i = 1 TO UBound(array)
	FPUT(FID, array[i], 1, i)
NEXT

DIM row = 2
DIM extensions[] = ".jpg", ".jpeg", ".png", ".bmp"

FOR FolderItem IN FolderItems
	FUKIDASI(row + "/" + FolderItems.Count)
	IF inArray(Folder.GetDetailsOf(FolderItem, iColumn["ファイル拡張子"]), extensions) = FALSE THEN CONTINUE
	FOR i = 1 TO UBound(array)
		FPUT(FID, Folder.GetDetailsOf(FolderItem, iColumn[array[i]]), row, i)
	NEXT
	row = row + 1
NEXT

FCLOSE(FID)

//////////////////////////////////////////////////
// 【引数】
//   needle : 探す値 
//   haystack : 配列 
//   strict 
// 【戻値】
//   TRUE : 配列中に指定した値が存在する、FFALSE : 配列中に指定した値が存在しない 
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
	DIM res = FALSE
	FOR item IN haystack
		IFB needle = item THEN
			res = TRUE
			BREAK
		ENDIF
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
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
  1. script.function.CREATEOLEOBJ(5,7)
  2. com.Shell.NameSpace(6,9)
  3. com.FSO.BuildPath(8)
  4. com.Shell.Folder.Items(10)
  5. udf.uniqueFilename(16)
  6. com.FSO.CreateTextFile(17)
  7. script.function.FOPEN(19)
  8. udf.UBound(23,33)
  9. script.function.FPUT(24,34)
  10. script.function.FUKIDASI(31)
  11. udf.inArray(32)
  12. com.Shell.Folder.GetDetailsOf(32)
  13. script.function.FCLOSE(39)

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

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. script.function.SETHOTKEY(1)
  2. script.function.GETID(4)
  3. script.function.GETSLIDER(6-12)
  4. script.function.FUKIDASI(13)
結果

[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. script.function.CREATEOLEOBJ(1)
  2. com.IE.Visible(2)
  3. com.IE.Navigate(3)
  4. script.function.SETHOTKEY(10)
  5. com.IE.document(⎙,14,15])
  6. dom.Document.getElementById(⎙,14,15])
  7. script.function.FUKIDASI(21)

マウス位置の色を取得

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. script.function.SETHOTKEY(2)
  2. script.function.PEEKCOLOR(5)
  3. script.function.FUKIDASI(9)
  4. script.function.SLEEP(10)
解説
  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)
    
    各成分を吹き出しに表示。
-PR-