使い方

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

目次

UWSC(Umiumiうみうみ Windowsウィンドウズ SCriptスクリプト)本体とPro版に付随するRecIEUWSC DebuggerUws2ExeUWSC Cross Referenceの使い方の説明です。

UWSCの導入

ダウンロード

現在、UWSC公式サイト(http://www.uwsc.info)は閲覧できませんが、Internet Archiveという過去のWebページを保存しているサイトを利用することでダウンロードできます。

最新バージョン

UWSCの最新バージョンは5.3.0.2UWSCの詳細情報 : Vector ソフトを探す!ではFree版のみダウンロードでき、ダウンロード(Internet Archive)ではFree版・Pro版ともにダウンロードすることができます。

過去バージョン

UWSC(Internet Archive)でアーカイブを見ることはでき、一部のバージョンはダウンロードすることも可能です。Pro版は2007年3月20日のVer4.2以降からのバージョンでダウンロードできます。

Wayback Machine(Internet Archive)で過去のバージョンをリストで見ることができ一部はダウンロードすることができます。リンク先のZIPファイルはFree版、EXEファイルはPro版のファイルで、例えばUWSC Ver4.7aの場合、Free版がhttp://www.uwsc.info/uwsc47a.zip、Pro版がhttp://uwsc.info/uwscpro47a.exeのリンクとなります。

以下がダウンロードできるバージョンの表です。GET_UWSC_VERで取得できる値も載せておきます。

Free版
Pro版

Ver4.6aはAxfc UpLoader -4059768.zip-でダウンロードできます。

ファイル名AboutGET_UWSC_VERプログラム名About日付
UWSCPRO46A.zip4.6a4.61UWSC Pro 4.6a2010/05/07

Ver4.3b1より前のものは、旧公式サイトであるうみうみ屋さん(http://www.h7.dion.ne.jp/~umiumi/)にあります。Wayback Machine

UWSCのアップデートの履歴は、公式サイト(UWSC(Internet Archive))トップページの新着情報/お知らせを参考に載せておきます。

履歴

インストール

Free版はダウンロードしたZIPファイルを解凍するだけでインストールは不要です。C:\Programs\などわかりやすい場所に移動させておきましょう。

Pro版は、ダウンロードしたuwscproXXX.exeXXXはバージョン)を実行しインストール作業を行います。

ユーザーアカウント制御が表示される場合はいを選択します。

アカウント制御.png

UWSCをインストールするには使用許諾契約書の同意に同意する必要があるので、内容をよく確認して同意するを選択します。

UWSC Pro セットアップ_使用許諾契約書の同意.png UWSC Pro セットアップ_使用許諾契約書の同意_同意する.png

以下の項目で必要ものにチェックを入れてください。

  1. デスクトップにUWSCのショートカットを作成
  2. ファイル拡張子.uwsにUWSCを関連付け
  3. スタートアップにUWSCのショートカットを作成
UWSC Pro セットアップ_追加タスクの選択.png

設定内容の確認し問題がなければインストールをクリックしてください。

UWSC Pro セットアップ_インストール準備完了.png

インストールの完了です。

UWSC Pro セットアップ_UWSC Pro セットアップウィザードの完了.png

インストール先はC:\Program Files (x86)\UWSC\です。

Pro版の試用期間は初回インストールから14日間です。それ以降も利用するには、ライセンスキーの登録が必要です。

Total UninstallのWindows - Uptodownから無料でダウンロードしよう(試用期間30日)でレジストリを削除すると試用期間をリセットできます。

インストール済みプログラムUWSCを選択し、アンインストールすることでリセットできます。

Total Uninstall Essential Editionを起動したらインストール済みプログラムを選択します。一覧からUWSCを選択します。フィルタにUWSCと入力すると見つけやすくなります。

Total Uninstall Essential Edition.png

UWSCを選択したらアンインストールをクリックします。アンインストールプロファイルの選択で解析済みプログラムのアンインストールが選択されているのを確認し、起動をクリックします。

Total Uninstall Essential Edition_アンインストール.png Total Uninstall Essential Edition_アンインストール_2.png

途中以下のようなダイアログが表示されますが、これはTotal Uninstallではなく通常のアンインストール処理なのでいいえを選択します。

Total Uninstall Essential Edition_アンインストール_3.png

選択されているプログラムを確認し、問題なければアンインストールをクリックします。

Total Uninstall Essential Edition_アンインストール_4.png

Pro版の登録

UWSC起動時に表示される以下の画面のユーザー登録からライセンスキーの登録ができます。

メイン画面が表示されている場合は、設定メニュUWSC_設定.pngをクリックしAboutを選択、タスクトレイにある場合はアイコンを右クリックしAboutを選択で表示されます。

UWSC About.png

購入時に取得したライセンスキーを入力しOKをクリックします。

User Registration.png

ライセンスキーが正しければ以下のようなメッセージが表示され、UWSC Proはシェアウェアです。登録済みと表示が変わります。

User Registration 登録.png UWSC About 登録後.png

ライセンスキーの確認方法

伝票番号がわかる場合

Vectorで購入した方は、ベクターPCショップ お申込状況確認で伝票番号とメールアドレスもしくは電話番号を入力することでライセンスキーを確認することができます。

伝票番号を忘れた場合は、ベクターPCショップ : ヘルプ Q&A・お問い合わせのページにある伝票番号がわかりませんの項目を参考にしてください。以下に引用を記載しておきます。

伝票番号はお手続き時のメールに記載しております。メールが残っていない場合は以下をご参照ください。

伝票番号の記載のあるメールは、「お支払いのご案内メール」と「ライセンスキーのご案内メール」です。

他のメールにも記載のあるものがございますが、どちらのメールもお手元にない場合は、ご購入履歴からお調べしますののでお問い合わせください。

お問い合わせする際、下記のご記入をお知らせください。
・お申込時にご入力いただいたお名前
・ご入力いただいたお電話番号
・ソフト名
・お申込時のメールアドレス

お問い合わせは下記より行なうことができます。

お問い合わせフォーム

他のパソコンでPro版の登録をしている場合

新しいパソコンに買い替えてUWSCのPro版を使いたいけどライセンスキーがわからない場合は、すでにPro版をインストールしているパソコンのレジストリを解析することにより新しいパソコンでもPro版を使うことができます。

ライセンスキーを所有している人ができる内容であって、Pro版を購入していない人が使えるようになるわけではありません。

この方法はライセンスキーを特定するのではなく、ライセンスキーの登録情報を新しいパソコンにコピーするだけです。

公式ページにも(1ライセンス:1人の使用者もしくは1台のコンピュータのどちらかといたします)とあるので、同じ人が使う分には問題ないと思います。

ライセンスキーに関わるレジストリはコンピューター\HKEY_USERS\<SID>\SOFTWARE\Classes\VirtualStore\MACHINE\Software\Wow6432Node\Umiumi\UWSC\SNにあります。

プログラムでレジストリの値を取得・設定

まずUWSC Pro版がインストールされているパソコンでの処理で、以下のプログラムを実行しレジストリから値を取得します。

UWSC
DIM SWbemLocator = CREATEOLEOBJ("WbemScripting.SWbemLocator")
DIM SWbemServices = SWbemLocator.ConnectServer
DIM query = "SELECT * FROM Win32_UserAccount WHERE Name = '" + TRIM(DOSCMD("echo %username%")) + "'"
SWbemObjectSet = SWbemServices.ExecQuery(query)

GETOLEITEM(SWbemObjectSet)

DIM SID = ALL_OLE_ITEM[0].SID
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
DIM SN = WshShell.RegRead("HKEY_USERS\" + SID + "\SOFTWARE\Classes\VirtualStore\MACHINE\Software\Wow6432Node\Umiumi\UWSC\SN")

PRINT SN
SENDSTR(0, SN)
FUKIDASI("クリップボードに値をコピーしました")
SLEEP(3.000)

この値を新しいパソコンで登録します。UWSC Pro版がインストールされている状態で、以下のプログラムを実行してください。11行目のSNに上のプログラムで取得した値を代入してから実行してください。このプログラムでレジストリを書き換えるので自己責任でお願いします。

UWSC
DIM SWbemLocator = CREATEOLEOBJ("WbemScripting.SWbemLocator")
DIM SWbemServices = SWbemLocator.ConnectServer
DIM query = "SELECT * FROM Win32_UserAccount WHERE Name = '" + TRIM(DOSCMD("echo %username%")) + "'"
SWbemObjectSet = SWbemServices.ExecQuery(query)

GETOLEITEM(SWbemObjectSet)
DIM SID = ALL_OLE_ITEM[0].SID
DIM WshShell = CREATEOLEOBJ("WScript.Shell")

DIM subKey = "HKEY_USERS\" + SID + "\SOFTWARE\Classes\VirtualStore\MACHINE\Software\Wow6432Node\Umiumi\UWSC\"
DIM SN = ""		// 取得した値を代入

IFB SN = "" THEN
	MSGBOX("SNに値が設定されていないので終了します。")
	EXIT
ENDIF

IF regKeyExists(subKey + "TM") AND !regKeyExists(subKey + "SN") THEN WshShell.RegWrite(subKey + "SN", SN, "REG_SZ")

FUNCTION regKeyExists(name)
	DIM WshShell = CREATEOLEOBJ("WScript.Shell")
	TRY
		WshShell.RegRead(name)
		RESULT = TRUE
	EXCEPT
		RESULT = FALSE
	ENDTRY
FEND
手動でレジストリの値を取得・設定

手動で追加する場合は、以下の手順で登録します。

まずUWSCのライセンスキーの場所を調べるためにSIDが必要なため調べます。コマンドプロンプトで以下を実行しログインユーザーのSIDを取得しておきます。

コマンドプロンプト
whoami /user

UWSCでも以下のプログラムを実行することで取得することができます。

UWSC
DIM SWbemLocator = CREATEOLEOBJ("WbemScripting.SWbemLocator")
DIM SWbemServices = SWbemLocator.ConnectServer
DIM query = "SELECT * FROM Win32_UserAccount WHERE Name = '" + TRIM(DOSCMD("echo %username%")) + "'"
SWbemObjectSet = SWbemServices.ExecQuery(query)
 
GETOLEITEM(SWbemObjectSet)
 
PRINT ALL_OLE_ITEM[0].SID

Rでファイル名を指定して実行を開きregeditと入力し、レジストリエディターを開きます。

レジストリでコンピューター\HKEY_USERS\S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx\SOFTWARE\Classes\VirtualStore\MACHINE\Software\Wow6432Node\Umiumi\UWSC\をアドレスバーに貼り付けて移動します。S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxxは取得したSIDに置き換えてください。

このときキー名に既定TMがあることを確認してください。ない場合はパスが間違っている可能性があります。

UWSC Pro ライセンスキー レジストリ 1.png

編集-新規-文字列値を選択すると新しい値 #1という項目が作成されるので、SNというキー名に書き換えます。

UWSC Pro ライセンスキー レジストリ 2.png UWSC Pro ライセンスキー レジストリ 3.png

作成したキー名を右クリックし修正値のデータに前のパソコンで取得した値を貼り付けます。

UWSC Pro ライセンスキー レジストリ 4.png

以下のようになればPro版を使うことができるようになるはずです。UWSCを起動していた場合はソフトを起動し直してください。

UWSC Pro ライセンスキー レジストリ 5.png

アンインストール

スタートをクリックし、UWSCもしくはUWSC Proフォルダ内にある同名のプログラムを右クリックし、アンインストールを選択します。

コントロール パネル\プログラム\プログラムと機能が開くので、一覧からUWSCを選択し、アンインストールをクリックしプログラムをパソコンから削除します。

メイン画面/動作記録と再生

メイン画面

起動時画面
UWSC_main.png
記録実行後画面
UWSC_not-save.png
UWSC_読み込み.png 読込み スクリプトファイルを読み込みます。(拡張子は".UWS"のみです)
UWSC_保存.png 保存 動作記録をスクリプトファイルとして保存します。
UWSC_再生.png 再生 記録したものを再生します。
UWSC_記録.png 動作記録 動作記録を開始します。
UWSC_設定.png 設定 各種設定のメニュが出ます。

読込み

UWSC_読込み.png

開くスクリプトのファイル名、実行回数、パラメータを指定します。実行回数には繰り返し実行する回数を指定します。

パラメータは引数を半角スペースで区切り、半角スペースを含む文字列は"(ダブルクォーテーション)で囲みます。受け取った引数はUNICODE文字列なので計算に使う場合はVAL関数 (スクリプト関数)などで数値化する必要があります。

パラメータは実行する度に渡され、PARAM_STRで受け取った引数にアクセスできます。改行コードは<#CR>、ダブルクォーテーションは<#DBL>、タブは<#TAB>で入力します。

以下はパラメータの例です。

第一引数:12、第二引数:51、第三引数:63を指定する場合。

UWSC
12 51 63

第一引数:abc、第二引数:d eを指定する場合。

UWSC
abc "d e"

第一引数:"xyz"を指定する場合。

UWSC
<#DBL>xyz<#DBL>

動作記録

UWSC_rec.png

記録ボタンを押してからSTOPボタン又は停止ホットキーが押されるまでの動作を記録します

低レベル記録
キーボードとマウスの押し下げ情報を座標と共に低レベル関数で記録します。記録はマウスクリックかキー操作がされるか、又は マウス移動を0.5秒停止して開始した所から始まります。
MMV,ACW,GETID,BTN,KBD
高レベル記録
高レベル関数を使用して記録します、座標は記録されません。
オブジェクトの選択操作は必ずマウスでしてください、キーボードで選択操作をした場合は記録できません。
多段メニューはメニューが出る毎にクリックを実行してください。
記録できないアプリやオブジェクトがあります。
保存にて記録をスクリプトファイルとして保存できます(スクリプトですので自分で修正したり制御したりできます)
GETID,CLKITEM,SLEEP

再生

再生ボタンで再生します。スクリプトファイルをドロップしてもOKです。
引数にスクリプトファイル名を指定してUWSCを起動してもOKです(この時はスクリプトが終了するとUWSC自体も常駐せずに終了します)。
スクリプトファイル名の後にパラメーターを付ければ 変数PARAM_STRに渡せます。
停止ホットキー(デフォルト:Alt+F2)にて中断できます。
再生ホットキー(デフォルト:Alt+F1)にて一時停止ができます。

設定メニュ/設定画面

設定メニュ

一つ目がタスクトレイ内にあるときの設定メニュー、二つ目がタスクトレイ外にあるときの設定メニューです。

_タスクトレイ内.png _タスクトレイ外.png

RecIE(Web記録)、Uws2Exe(EXE作成)、Debugger(デバッグ) は UWSC Pro版の機能です。

タスクトレイ内外共通の項目

設定(X)
設定画面を開きます。
RecIE(Web記録)(R)
RecIEを起動します。
Uws2Exe(EXE作成)(U)
Uws2Exeを起動します。
Debugger(デバッグ)(D)
Debuggerを起動します。
.INI/.LOG Folder(F)
UWSC.INIがあるフォルダ(C:\Users\username\AppData\Roaming\UWSC\)を開きます。
Help(H)
UWSCヘルプ(C:\Program Files (x86)\UWSC\uwsc.chm)を開きます。
About(A)
UWSC Aboutを開きます。バージョンや最新版のチェック、Pro版への登録の有無が確認できます。
終了(Z)
UWSCを終了します。
設定メニュ(タスクトレイ内)

タスクトレイ上のアイコンで右クリックすると設定メニュが出ます。

_タスクトレイ内.png
タスクトレイから出る(W)
UWSCをタスクトレイから出し、ウィンドウを表示させます。
設定メニュ(タスクトレイ外)

タスクトレイ外(メイン画面)で設定をクリックと設定メニュが出ます。

_設定_ランチメニュ.png
タスクトレイに格納(W)
UWSCをタスクトレイに格納します。
ランチメニュ(M)、ランチメニュの設定(Z)...
スクリプトファイルを 登録しておき 選択起動できます。(スクリプトファイル以外の EXEや関連付けされたファイル等も登録できます)。

ランチメニュ

タスクトレイ上のアイコンで左クリック:ランチメニュがでます。

.png

スクリプト登録

スクリプト設定を行います。

_スクリプト登録.png

スクリプト設定

_スクリプト登録_スクリプト設定.png

タスクトレイ上のアイコンで左ダブルクリック:タスクトレイから出て通常状態になります。

タスクトレイ上で終了すると次回起動時はタスクトレイ起動になります。

階層化は、同じような処理をグループ化するときに利用します。

_階層化.png .png

以下にランチメニュに登録しておくと便利なスクリプトを記載しておきます。

スクリプトはドキュメント\UWSC\Scripts\フォルダなど同じところにまとめておくと管理しやすくなります。

  • 項目取得
    • タイトル・クラス名を取得
    • カーソル座標と色情報を取得
    • CLKITEMで操作できる項目を取得
    • CHKBTNで操作できる項目を取得
    • GETSTRで取得できるすべての項目を取得
    • GETITEMで取得できるすべての項目を取得
    • GETSLCTLSTで操作できる項目を取得
  • クリップボード文字列の操作
    • 大文字に変換
    • 小文字に変換
    • ひらがなに変換
    • カタカナに変換
    • 半角文字に変換
    • 全角文字に変換
  • タイトル・クラス名
  • 座標・色情報
  • CLKITEM
  • CHKBTN
  • GETSTR
  • GETITEM
  • GETSLCTLST
  • 大文字
  • 小文字
  • ひらがな
  • カタカナ
  • 半角文字
  • 全角文字
UWSC
PUBLIC ttl, cls

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_C, MOD_ALT, "sendToClipboard")

WHILE TRUE
	DIM ID = GETID(GET_FROMPOINT_WIN)
	ttl = STATUS(ID, ST_TITLE)
	cls = STATUS(ID, ST_CLASS)
	FUKIDASI(ttl + "<#CR>" + cls)
	SLEEP(0.001)
WEND

PROCEDURE forceQuit()
	EXITEXIT
FEND

PROCEDURE sendToClipboard()
	SENDSTR(0, "DIM ID = GETID(<#DBL>" + ttl + "<#DBL>, <#DBL>" + cls + "<#DBL>)")
FEND
UWSC
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
UWSC
OPTION LOGPATH = "CLKITEM.log"
OPTION LOGFILE = 6

HASHTBL ITEMS

ITEMS["ITM_BTN"] = "CLK_BTN"
ITEMS["ITM_LIST"] = "CLK_LIST"
ITEMS["ITM_TAB"] = "CLK_TAB"
ITEMS["ITM_MENU"] = "CLK_MENU"
ITEMS["ITM_TREEVIEW"] = "CLK_TREEVIEW"
ITEMS["ITM_LISTVIEW"] = "CLK_LISTVIEW"
ITEMS["ITM_TOOLBAR"] = "CLK_TOOLBAR"
ITEMS["ITM_LINK"] = "CLK_LINK"
ITEMS["ITM_ACCCLK"] = "CLK_ACC"

FOR sec = 3 TO 1 STEP -1
	FUKIDASI(sec + "秒後にアクティブなウィンドウの情報を取得します。")
	SLEEP(1.000)
NEXT

DIM ID = GETID(GET_ACTIVE_WIN)

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

FUKIDASI("「" + STATUS(ID, ST_TITLE) + "」…取得中")

//FOR item IN array
FOR i = 0 TO LENGTH(ITEMS) - 1
	PRINT "//////////////////////////////////////////////////"
	PRINT "// " + ITEMS[i, HASH_KEY]
	PRINT "//////////////////////////////////////////////////"
	PRINT "GETITEM(ID, " + ITEMS[i, HASH_KEY] + ", -1) = " + GETITEM(ID, EVAL(ITEMS[i, HASH_KEY]), -1)
	FOR j = 0 TO LENGTH(ALL_ITEM_LIST) - 1
		str = ALL_ITEM_LIST[j]
		str = REPLACE(str, "<#CR>", "<@cr>")
		str = REPLACE(str, "<#DBL>", "<@dbl>")
		str = REPLACE(str, "<#TAB>", "<@tab>")
		str = REPLACE(str, CHR(10), "<#DBL>+CHR(10)+<#DBL>")
		str = REPLACE(str, "<@", "<#")
		PRINT "CLKITEM(ID, <#DBL>" + str + "<#DBL>, " + ITEMS[i, HASH_VAL] + ")"
	NEXT
	PRINT
NEXT
UWSC
OPTION LOGPATH = "CHKBTN.log"
OPTION LOGFILE = 6

HASHTBL ITEMS

DIM array[] = "BTN", "TAB", "MENU"

FOR sec = 3 TO 1 STEP -1
	FUKIDASI(sec + "秒後にアクティブなウィンドウの情報を取得します。")
	SLEEP(1.000)
NEXT

DIM ID = GETID(GET_ACTIVE_WIN)

FUKIDASI("「" + STATUS(ID, ST_TITLE) + "」…取得中")

FOR item IN array
	FOR i = 0 TO EVAL("GETITEM(ID, ITM_" + item + ", -1, -1)") -1
		IF ALL_ITEM_LIST[i] = "" THEN CONTINUE
		ITEMS[ALL_ITEM_LIST[i]] = ""
	NEXT
NEXT

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

FOR i = 0 TO LENGTH(ITEMS)-1
	item = ITEMS[i, HASH_KEY]
	DIM n = 0
	WHILE TRUE
		n = n + 1
		DIM flg = FALSE
		FOR j = 0 TO 1
			DIM acc = VARTYPE(j, VAR_BOOLEAN)
			cmd = "CHKBTN(ID, <#DBL>" + item + "<#DBL>, " + n + ", " + acc + ")"
			IFB EVAL(cmd) <> -1 THEN
				flg = TRUE
				PRINT cmd + "<#TAB>// " + EVAL(cmd)
				BREAK
			ENDIF
		NEXT
		IF !flg THEN BREAK
	WEND
NEXT
UWSC
OPTION LOGPATH = "GETSTR.log"
OPTION LOGFILE = 6

FOR sec = 3 TO 1 STEP -1
	FUKIDASI(sec + "秒後にアクティブなウィンドウの情報を取得します。")
	SLEEP(1.000)
NEXT

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

FUKIDASI("「" + STATUS(ID, ST_TITLE) + "」…取得中")

HASHTBL ITEMS

ITEMS["STR_EDIT"] = STR_EDIT
ITEMS["STR_STATIC"] = STR_STATIC
ITEMS["STR_STATUS"] = STR_STATUS
ITEMS["STR_ACC_EDIT"] = STR_ACC_EDIT
ITEMS["STR_ACC_STATIC"] = STR_ACC_STATIC

HASHTBL COUNT

COUNT["STR_EDIT"] = GETITEM(ID, ITM_EDIT, -1)
COUNT["STR_STATIC"] = GETITEM(ID, ITM_STATIC, -1)
COUNT["STR_STATUS"] = GETITEM(ID, ITM_STATUSBAR, -1)
COUNT["STR_ACC_EDIT"] = GETITEM(ID, ITM_ACCTXT, -1)
COUNT["STR_ACC_STATIC"] = GETITEM(ID, ITM_ACCTXT, -1)

FOR i = 0 TO LENGTH(ITEMS) - 1
	DIM item = ITEMS[i, HASH_KEY]
	DIM len = COUNT[item]
	PRINT "//////////////////////////////////////////////////"
	PRINT "// " + item
	PRINT "//////////////////////////////////////////////////"
	FOR j = 0 TO len - 1
		GETSTRList(id, i, j, ITEMS)
	NEXT
	FOR j = 0 TO (-1 * (len - 1)) STEP -1
		GETSTRList(id, i, j, ITEMS)
	NEXT
	PRINT
NEXT

PROCEDURE GETSTRList(id, i, j, ITEMS[])
	DIM str = GETSTR(id, j, ITEMS[i, HASH_VAL])
	IFB LENGTH(str) <> 0 THEN
		res = "PRINT GETSTR(ID, " + j + ", " + ITEMS[i, HASH_KEY] + ")" + "<#TAB>// <#DBL>" + str + "<#DBL>"
		IFB j <> 0 THEN
			IFB ITEMS[i,HASH_KEY] = "STR_EDIT" THEN
				res = res + "<#TAB>// SENDSTR(ID, <#DBL>" + str  + "<#DBL>, " + j + ", TRUE)"
			ELSEIF ITEMS[i, HASH_KEY] = "STR_ACC_EDIT" THEN
				res = res + "<#TAB>// SENDSTR(ID, <#DBL>" + str + "<#DBL>, " + j + ", TRUE, TRUE)"
			ENDIF
		ENDIF
		PRINT res
	ENDIF
FEND
UWSC
OPTION LOGPATH = "GETITEM.log"
OPTION LOGFILE = 6

FOR sec = 3 TO 1 STEP -1
	FUKIDASI(sec + "秒後にアクティブなウィンドウの情報を取得します。")
	SLEEP(1.000)
NEXT

DIM ID = GETID(GET_ACTIVE_WIN)

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

FUKIDASI("「" + STATUS(ID, ST_TITLE) + "」…取得中")

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

FOR item IN array
	PRINT "//////////////////////////////"
	PRINT "//  " + item + ""
	PRINT "//////////////////////////////"
	DIM num = GETITEM(ID, EVAL("ITM_" + item), -1)
	PRINT "GETITEM(ID, ITM_" + item + ", -1) = " + num
	FOR i =  0 TO num - 1
		PRINT "CLKITEM(ID, <#DBL>" + ALL_ITEM_LIST[i] + "<#DBL>, CLK_" + item + ")"
	NEXT
	PRINT
NEXT
UWSC
OPTION LOGPATH = "GETSLCTLST.log"
OPTION LOGFILE = 6

HASHTBL ITEMS

ITEMS["ITM_LIST"] = "CLK_LIST"
ITEMS["ITM_TREEVIEW"] = "CLK_TREEVIEW"
ITEMS["ITM_LISTVIEW"] = "CLK_LISTVIEW"

FOR sec = 3 TO 1 STEP -1
	FUKIDASI(sec + "秒後にアクティブなウィンドウの情報を取得します。")
	SLEEP(1.000)
NEXT

DIM ID = GETID(GET_ACTIVE_WIN)

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

FUKIDASI("「" + STATUS(ID, ST_TITLE) + "」…取得中")

//FOR item IN array
FOR i = 0 TO LENGTH(ITEMS) - 1
	PRINT "//////////////////////////////////////////////////"
	PRINT "// " + ITEMS[i, HASH_KEY]
	PRINT "//////////////////////////////////////////////////"
	PRINT "CLKITEM(ID, " + ITEMS[i, HASH_KEY] + ", -1) = " + GETITEM(ID, EVAL(ITEMS[i, HASH_KEY]), -1)
	FOR j = 0 TO LENGTH(ALL_ITEM_LIST) - 1
		str = ALL_ITEM_LIST[j]
		str = REPLACE(str, "<#CR>", "<@cr>")
		str = REPLACE(str, "<#DBL>", "<@dbl>")
		str = REPLACE(str, "<#TAB>", "<@tab>")
		str = REPLACE(str, CHR(10), "<#DBL>+CHR(10)+<#DBL>")
		str = REPLACE(str, "<@", "<#")
		PRINT "CLKITEM(ID, <#DBL>" + str + "<#DBL>, " + ITEMS[i, HASH_VAL] + ")"
	NEXT
	PRINT
NEXT
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_UPPERCASE))
FUKIDASI("大文字に変換しました")
SLEEP(0.500)
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_LOWERCASE))
FUKIDASI("小文字に変換しました")
SLEEP(0.500)
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_HIRAGANA)
FUKIDASI("ひらがなに変換しました")
SLEEP(0.500)
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_KATAKANA)
FUKIDASI("カタカナに変換しました")
SLEEP(0.500)
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_HALFWIDTH)
FUKIDASI("半角文字に変換しました")
SLEEP(0.500)
UWSC
SENDSTR(0, STRCONV(GETSTR(0), SC_FULLWIDTH)
FUKIDASI("全角文字に変換しました")
SLEEP(0.500)

設定

UWSC_setting.png
低レベル記録
低レベル記録は 単純にキーボードとマウスの押し下げ情報を座標と共に低レベル関数で記録します。 記録はマウスクリックかキー操作がされるか、又は マウス移動を0.5秒停止して開始した所から始まります。
余分な時間、マウス移動は記録しない
ここがチェックされていれば マウス移動や余分な時間は記録されません
マウス座標を相対座標で記録する
ここがチェックされていれば マウスの座標はアクティブウィンドウに対しての座標で記録されます(後で位置調整の為スクリプトを修正するのであれば、こちら方が良いでしょう)
高レベル記録
高レベル記録は 高レベル関数を使用して記録します、座標は記録されません。オブジェクトの選択操作は必ずマウスでしてください、キーボードで選択操作をした場合は記録できません。操作はゆっくり実行してください、速いと取りこぼす事があります。多段メニューはメニューが出る毎にクリックを実行してください。記録できないアプリやオブジェクトがあります。
記録後クリップボードへコピーする
記録終了後、スクリプトをクリップボードへコピーします
ホットキー
再生
再生ボタンのホットキーを設定します
停止
再生/記録の停止ホットキーを設定します
記録
記録ボタンのホットキーを設定します
トレイ
タスクトレイ出入りのホットキーを設定します

ホットキーは以下の組み合わせから選択します。

母体キー
  1. CTRL
  2. WIN
  3. ALT
  4. SHIFTCTRL
  5. SHIFTALT
  6. CTRLALT
組み合わせるキー
  1. SPACE
  2. F1
  3. F2
  4. F3
  5. F4
  6. F9
  7. F10
  8. F11
  9. F12
  10. Q
  11. W
  12. E
  13. R
  14. A
  15. S
  16. D
  17. F
  18. End
  19. Home
  20. F5
  21. F6
  22. F7
  23. F8
  24. T
  25. Y
  26. U
  27. I
  28. O
  29. P
  30. G
  31. H
  32. J
  33. K
  34. L
  35. Z
  36. X
  37. C
  38. V
  39. B
  40. N
  41. M
  42. 1
  43. 2
  44. 3
  45. 4
  46. 5
  47. 6
  48. 7
  49. 8
  50. 9
  51. 0

プルダウンメニューそのままの順番で書いていますが、組み合わせるキーはまとめると以下のようになります。

  • アルファベット(A〜Z)
  • 数字(0〜9)
  • ファンクションキー(F1〜F12)
  • スペース(Space)
  • 矢印(上下左右)
  • Home・End
スケジューラー
スクリプトのスケジュール設定画面を開きます。スケジュール設定を参照。

スケジュール設定

UWSC_schedule.png

スクリプトのスケジュール設定ができます。スクリプトファイル名を設定してタイマー設定にて起動時間を指定してください。

休止状態から復帰するがチェックであればサスペンド状態からでも復帰し実行できます。ビープ音で知らせるがチェックであればスクリプト起動時にビープ音で知らせて間を2秒程取ります。

スクリプトの項目には、タイマーに登録するスクリプトのパスと実行回数を設定します。インプットボックスに直接パスを入力するか、...で登録するファイルを選択、実行回数を設定します。インプットボックスに直接入力する場合、スクリプトのパス -R<実行回数>の形式で入力します。実行回数が1回だけの場合スクリプトのパスと入力し、-Rnを省略することができます。

タイマーの項目(初期値:設定なし)を選択すると、実行するタイミングを設定できます。現在設定されている項目で設定なし起動時N分毎H時間毎HH:NN:<毎日|毎週|毎月>:<曜日|日付>YYYYMMDD:HH:NN:一回<式>win:<Title>:<Class>のいずれかの形式が表示されます。

スケジュールしたスクリプトを実行するにはUWSCが起動している必要があります。毎日など設定している場合は、スタートアップにUWSC.exeを指定してタスクトレイに常駐させておくと良いです。

タイマー設定

UWSC_schedule_timer.png
設定なし
タイマー設定を行いません。[設定なし]を選択しOKで確定すると、他の項目に入力していた内容は破棄されます。
UWSC起動時
UWSCが起動したときにスクリプトを実行します。
インターバル
0時0分を基準に計算をしています (UWSC起動時からの時間ではない)
分単位:1分毎,2分毎,3分毎,4分毎,5分毎,10分毎,15分毎,20分毎,30分毎
時間単位:1時間毎,2時間毎,3時間毎,4時間毎,6時間毎,8時間毎,12時間毎
時間指定
毎日毎週日~土毎月1~31のいずれかを指定します。
一回だけ実行
指定した日時に一回だけ実行されます。
式による設定
自分で式を記述する事により細かな時間設定が決められます
式の書き方は、式による設定で使える変数・演算子を参照。
注意:チェックは分単位でされます、分単位の設定(NN,YMDNN)を忘れずに
NN,YMDNNを記述しないと毎分実行されることになります。
指定Windowが現れた時
タイトルとクラス名のどちらか一方だけでも可
タイトルは一部分だけでも可
別プロセスで実行
別プロセスで実行します
スクリプト実行中でも起動する事ができます

式による設定で使える変数・演算子

変数
変数 意味
YY
MM
DD
HH
NN
YMDNN 2000年からの経過分
WW 曜日(日=0、月=1、火=2、水=3、木=4、金=5、土=6)

指定した日時のYMDNN(2000年からの経過分)を求めるプログラムです。

UWSC
DIM date = "2021/09/17 15:01:00"
PRINT INT(GETTIME(0, date) / 60)

以下は現在のYMDNNを表示するプログラムです。1分毎に1ずつ増加されていきます。

UWSC
WHILE TRUE
	DIM YMDNN = INT(GETTIME()/60)
	FUKIDASI(YMDNN)
	SLEEP(0.100)
WEND
論理演算子

論理演算子は、論理式や条件式を組み合わせて論理的な判定や演算を行うための演算子です。一般的には、論理演算子は真偽値(真または偽)を扱います。

演算子 意味 記述例
AND 論理積 a AND b…a、bともに真
OR 論理和 a OR b…a、bのいずれかが真
算術演算子

一定間隔で実行するとき利用します。

演算子 意味 記述例
MOD 剰余演算子 a MOD b…aをbで割った余り
比較演算子

比較演算子は、2つの値を比較して真偽値(真または偽)を返すための演算子です。

演算子 意味 記述例
< より小さい a < b…aはbより小さい
> より大きい a > b…aはbより大きい
= 等しい a = b…aとbは等しい
<> 等しくない a <> b…aとbは等しくない
<= 以下 a <b…aはb以下
>= 以上 a >b…aはb以上

式による設定

指定した式に一致する日時にスクリプトを実行します。

以下に式の書き方を記載していますが、式として指定するときはYMDNNまたはNNとともに指定する必要があるので注意してください。毎分実行されることになります。

毎日12時00分

UWSCスケジュール
HH = 12 AND NN = 0

毎日0時00分、2時00分、4時00分、…、22時00分

UWSCスケジュール
HH MOD 2 = 0 AND NN = 0

休日(日または土)

UWSCスケジュール
WW = 0 OR WW = 6

日:0、土:6なので6で割った余りが0でも土日と判定できます。

UWSCスケジュール
WW MOD 6 = 0

平日(月〜金)

UWSCスケジュール
WW >= 1 AND WW <= 5

土日は6で割った余りが0だったので、平日は余りが0以外で判定できます。

UWSCスケジュール
WW MOD 6 <> 0

min分毎に実行する場合は、剰余関数(MOD)を利用します。

UWSCスケジュール
YMDNN MOD min = 0

20分毎に実行する場合は以下のようになります。毎時0分、20分、40分。

UWSCスケジュール
YMDNN MOD 20 = 0

min分毎で実行日時をoffsetだけ時間をずらす場合は、以下のように記述します。

UWSCスケジュール
YMDNN MOD min = offset

毎時5分、35分(min:30分毎、offset:+5分)

UWSCスケジュール
YMDNN MOD 30 = 5
(YMDNN - 5) MOD 30 = 0

offsetがマイナス値になる場合は、以下のようにoffsetminを加えます。

UWSCスケジュール
YMDNN MOD min = offset + min

毎時17分、37分、57分(min:20分毎、offset:-3分)

17-3+20offset+min)から求められます。

UWSCスケジュール
YMDNN MOD 20 = 17
(YMDNN + 3) MOD 20 = 0

以下の式はoffsetがマイナス値になるかどうかに関係なく使えます。

UWSCスケジュール
(YMDNN - offset) MOD min = 0
記述例

火曜日の0時と12時

UWSCスケジュール
(WW=2) AND (HH=0 OR HH=12) AND (NN=0)

18分間隔

UWSCスケジュール
(YMDNN MOD 18) = 0

分が00のとき(1時間毎)

UWSCスケジュール
NN = 0

分の一の位が「3」の時間(毎時3,13,23,33,43,53分)

UWSCスケジュール
(NN MOD 10) = 3

分が55分以降(毎時55,56,57,58,59分)

UWSCスケジュール
NN >= 55

休日(土日)の12:00

UWSCスケジュール
WW MOD 6 = 0 AND HH = 12 AND NN = 0

平日(月〜金)の18:00

UWSCスケジュール
WW MOD 6 <> 0 AND HH = 18 AND NN = 0

毎月1日の0:00

UWSCスケジュール
DD = 1 AND HH = 0 AND NN = 0

存在しない変数や演算子を使ったとき、1年以内に実行する予定がないときは以下のメッセージが表示されます。

UWSC_スケジュール_式による設定_式がおかしいです.png UWSC_スケジュール_式による設定_1年以内での実行は無し.png

実行する日時が複雑な場合は、スクリプトを複数に分けてスケジュールに登録するのも良いと思います。

以下は式がマッチする日時を取得します。

5行目のFOR文で終了値を60 * 24 * 7(現在時刻から一週間までに一致する日時)にしてますが、もっと大きい値を入れるとより先の日時まで求められます。

UWSC
DIM base = INT(GETTIME()/60)
DIM formula = INPUT("式を入力")
IF formula = EMPTY OR formula = "" THEN EXIT

FOR minute = 1 TO 60 * 24 * 7
	DIM date = dateAdd("n", base + minute, "2000/01/01 00:00:00")
	GETTIME(0, date)
	DIM YY = G_TIME_YY
	DIM MM = G_TIME_MM
	DIM DD = G_TIME_DD
	DIM HH = G_TIME_HH
	DIM NN = G_TIME_NN
	DIM WW = G_TIME_WW
	DIM YMDNN = base + minute
	IFB EVAL(formula) THEN
		PRINT dateAdd("n", YMDNN, "2000/01/01 00:00:00") + IIF(HH=0 AND NN=0, " 00:00:00", "")
	ENDIF
NEXT

//////////////////////////////////////////////////
// 【引数】
//   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)
	DIM time = G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
	SELECT interval
		CASE "yyyy"
			d = (G_TIME_YY + num) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
			IF time <> "00:00:00" THEN d = d + " " + time
		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
			IF time <> "00:00:00" THEN d = d + " " + time
		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月とする 
// 【戻り値】
//   dateからm月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	date = dateAdd("m", m + 1, date)
	GETTIME(0, date)
	GETTIME(-G_TIME_DD, date)
	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

//////////////////////////////////////////////////
// 【引数】
//   date : 存在するかを調べる日付文字列。YYYYMMDD or YYYY/MM/DD or YYYY-MM-DDのいずれかの形式。 
// 【戻り値】
//   TRUE : 日付として認識できる、FALSE : 日付として認識できない 
//////////////////////////////////////////////////
FUNCTION isDate(date)
	TRY
		GETTIME(0, date)
		RESULT = TRUE
	EXCEPT
		RESULT = FALSE
	ENDTRY
FEND

指定Windowが現れた時

指定したWindowが現れた時にスクリプトを実行します。

ウィンドウのタイトルとクラス名を取得するプログラムです。Alt+Cでクリップボードにマウスカーソル下のウインドウのタイトルとクラス名を送ります。

UWSC
PUBLIC ttl, cls

SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_C, MOD_ALT, "sendToClipboard")

WHILE TRUE
	DIM ID = GETID(GET_FROMPOINT_WIN)
	ttl = STATUS(ID, ST_TITLE)
	cls = STATUS(ID, ST_CLASS)
	FUKIDASI(ttl + "<#CR>" + cls)
	SLEEP(0.001)
WEND

PROCEDURE forceQuit()
	EXITEXIT
FEND

PROCEDURE sendToClipboard()
	SENDSTR(0, ttl + "," + cls)
	FUKIDASI("コピーしました")
	SLEEP(1.000)
FEND

ランチメニュ

スクリプトファイルを登録しておき選択起動できます
(スクリプトファイル以外の EXEや関連付けされたファイル等も登録できます)
ホットキー設定により出現 タスクトレイ時は左ボタンにて出現

RecIE

RecIE.png
記録/停止
指定したURLを開いたところから記録を開始し、停止が押されるまで記録されます。
再生
記録したスクリプトを再生します。
保存
生成されたスクリプトを保存します。
設定
記録時の設定をします。
RecIE_右クリック.png

右クリックメニュー

表示項目の取得
マウス位置の表示項目を取得します。
クリック処理
JavaScript処理、画像等で通常クリックで記録できない場合やURLではなくオブジェクト文字として記録したい場合に利用します。
ページに戻る
表示ページを戻します。
HTMLの取得
HTMLのbody部を取得します。範囲設定されている場合はその部分のみを取得します。

Debugger

UWSC Debugger.png

プログラムが複雑になってくると実行時に間違いを見つけることは困難になります。そこでデバッグを行うことで効率的にコーディングすることができるようになります。

左側がスクリプトを記述するスクリプト表示領域、右側上段がグローバル変数表示、中段がローカル変数表示、下段がPRINT文 ログ表示でPRINT文で出力した内容が表示されます。出力するログの1行が長くなる場合は、1024文字毎に折り返されます。

UWSC Debugger(実行中).png UWSC Debugger(実行中)_ブレークポイント.png UWSC Debugger(実行中)_Local.png

行番号をクリックするとブレークポイントを設定でき、実行時にその行で一時停止させることができます。その時点での変数の値が右欄に表示されるため、間違いを見つけやすくなります。OPTIONPUBLICCONSTPROCEDUREFUNCTIONTEXTBLOCKENDTEXTBLOCKMODULEの行にはブレークポイントを設定することはできません。

グローバル・ローカル変数表示

モジュール
Global・Local
モジュール名.関数名
モジュール名.配列[ ]
起動時パラメータ
Global・Local
PARAM_STR[ ]
UWSC
Array of
配列
一次元配列
Global・Local
配列名[ ]
一次元セーフ配列
Global・Local
配列名->[ ]
ニ次元配列
Global・Local
配列名[ ][ ]
ニ次元セーフ配列
Global・Local
配列名->[ ][ ]
連想配列
Global・Local
連想配列名[ ]

Valueは以下のように表示されます。

Value
キー1:値1, キー2:値2, キー3:値3, …

変数の型

番号 意味
0 Empty EMPTY
1 Null NULL
2 SmallInt 数値
3 Integer 数値
4 Single 数値
5 Double 数値
6 Currency 通貨型
7 Date 日付型
8 UString 文字型
9 Dispatch ポインター
10
11 Boolean ブール型
12
13
16 Char バイト型(符号付)
17 Byte バイト型(符号なし)
18 Word 数値
19 LongWord 数値
20 Int64 数値
256
258
8192

Debuggerのメニュー

Debuggerにあるメニューは以下の通りです。

LoadDebugger_Load.png
UWSスクリプトの読込み
SaveDebugger_Save.png
UWSスクリプトの保存
RunDebugger_Run.png
スクリプトの実行
PauseDebugger_Pause.png
一時停止
StopDebugger_Stop.png
実行の停止
Step InDebugger_Step In.png
ステップ(一行)実行(関数があれば関数の中に入る)
Step OverDebugger_Step Over.png
ステップ(一行)実行(関数の中に入らない)
TraceDebugger_Trace.png
現在の実行行を示します。一行実行する毎に指定のディレイ(ms)が入ります。ディレイに-1が設定されたときは実行行の追従はせず、変数値のみ更新します。
Function&Procedure
指定関数行に移動します。
Search
文字検索
Script

プログラムはC:\Program Files(x86)\UWSC\DbgScript\にあります。

  1. Info Under MouseCursor
    マウスカーソル下の情報を取得します
  2. ObjectCharacter By Type
    指定ウィンドウの全オブジェクトの文字を種類別に取得
  3. Object With Handle
    ハンドルを持つオブジェクトの情報取得
  4. PosAcc Search
    PosAcc関数にて画面をサーチし情報取得
Option
  1. Cross Reference
    クロスリファレンスリスト(変数や関数の使用行表示)の起動。利用されていない変数や関数は赤で表示されます。行番号をダブルクリックするとデバッガをその行に移動します。
  2. Transparent Window...
    デバッガ自身もしくはデバッガに重なるアクティブWindowを透過処理
  3. Font / Color
    フォント設定や文字カラーの設定をします
  4. Uws2Exe
    EXE化ツールを起動します
Help
  1. Debugger Help
    UDebugのヘルプ(UDebug.chm)を開きます。ファイルのパスはC:\Program Files (x86)\UWSC\UDebug.chmです。
  2. UWSC Help
    UWSCのヘルプ(uwsc.chm)を開きます。ファイルのパスはC:\Program Files (x86)\UWSC\uwsc.chmです。
  3. .INI/.LOG Folder
    エクスプローラにて、UDebug.INIのあるフォルダを開きます。フォルダのパスはC:\Users\username\AppData\Roaming\UWSC\です。
  4. About
    バージョン情報を表示します。最新版は2016/10/15でUWSC Ver5.2.3.0、UDebug Ver2.2.3.0です。

Scriptにあるプログラム

  • C:\Program Files (x86)\UWSC\DbgScript
    • Info_Under_MouseCursor.uws
    • Object_With_Handle.uws
    • ObjectCharacter_By_Type.uws
    • PosAcc_Search.uws
  • Info_Under_MouseCursor.uws
  • Object_With_Handle.uws
  • ObjectCharacter_By_Type.uws
  • PosAcc_Search.uws
UWSC
// マウスカーソル下の情報取得
// Windowタイトル, Windowクラス名, クライアント位置, オブジェクトクラス名, POSACC, 色
// 

title = "マウスカーソル下の情報"
if GETID(title, "TFormhtm")>0 then Exit
dbg_id = GETID("UWSC Debugger","TFOya")
CtrlWin(dbg_id, MIN)
Try
  obj = CREATEFORM("about:blank", title, True, 0, 400, 210, 0 ,0)
  CONST MAX_LENGTH = 64    // Maximum number of characters
  CtrlWin(GETID(GET_FORM_WIN), ACTIVATE)
  while obj.Visible
     Sleep(0.5)
     if GetKeyState(VK_ESC) then break
     x=G_MOUSE_X;  y=G_MOUSE_Y
     fm = def_form
     fpid = GETID(GET_FROMPOINT_WIN)
     objid = GETID(GET_FROMPOINT_OBJ)
     gx = G_MOUSE_X
     gy = G_MOUSE_Y
     clx = gx - Status(fpid,ST_CLX)
     cly = gy - Status(fpid,ST_CLY)
     fm = Replace(fm, "DEF_WTITLE", Status(fpid,ST_TITLE))
     fm = Replace(fm, "DEF_WCLASS", Status(fpid,ST_CLASS))
     fm = Replace(fm, "DEF_X", clx)
     fm = Replace(fm, "DEF_Y", cly)
     fm = Replace(fm, "DEF_OBJCLS", Status(objid,ST_CLASS))
     s = POSACC(fpid, clx, cly)
     if Length(s)>MAX_LENGTH then s = Copy(s,1,MAX_LENGTH)+"..."
     fm = Replace(fm, "DEF_ACC", s)
     gbr = PEEKCOLOR(gx, gy)
     gbr16 = Replace(Format(gbr,6,-1)," ","0")
     fm = Replace(fm, "DEF_BGR", "$"+gbr16)
     fm = Replace(fm, "DEF_R", gbr and $FF)
     fm = Replace(fm, "DEF_G", (gbr/$100) and $FF)
     fm = Replace(fm, "DEF_B", (gbr/$10000) and $FF)
     fm = Replace(fm, "DEF_FNTCOL", Copy(gbr16,5,2)+Copy(gbr16,3,2)+Copy(gbr16,1,2)) // RGB
     obj.Document.open()
     obj.Document.write(fm)
     obj.Document.close()
  wend
Finally
  CtrlWin(dbg_id, NORMAL)
EndTry
// --- main end ---

// 表示フォーム
TextBlock def_form
<nobr>
Windowタイトル: DEF_WTITLE<br>
Windowクラス名: DEF_WCLASS<br>
クライアント位置: DEF_X, DEF_Y<br>
オブジェクトクラス名: DEF_OBJCLS<br>
POSACC: DEF_ACC<br>
色:BGR=DEF_BGR (R=DEF_R, G=DEF_G, B=DEF_B) <font color='#DEF_FNTCOL'>■■■■■</font>
</nobr>
EndTextBlock
UWSC
// ハンドルを持つオブジェクトの情報取得
// "X, Y, 幅, 高さ, クラス名, キャプション"  (可視状態の物のみ、位置はクライアント座標)
//

dbg_id = GETID("UWSC Debugger","TFOya")
CtrlWin(dbg_id, MIN)
Try
  Fukidasi("ハンドルを持つオブジェクトの情報の表示<#CR>  ウィンドウにカーソルを合わせから Shiftキーを押してください<#CR>  キャンセル: ESCキー")
  Repeat
     if GetKeyState(VK_ESC) then Exit
     Sleep(0.02)
  Until GetKeyState(VK_SHIFT)
  Fukidasi()

  PUBLIC fpid, form, lcnt
  fpid = GETID(GET_FROMPOINT_WIN)
  form = "X, Y, 幅, 高さ, <#DBL>クラス名<#DBL>, <#DBL>キャプション<#DBL>"
  form = form + "<BR><select name='hlist' size='_DEF_SIZE_'>"
  lcnt = 0
  HndInfo(fpid, 0)
  form = form + "</select>"
  if lcnt < 2 then lcnt = 2
  form = Replace(form, "_DEF_SIZE_", lcnt)
  obj = CREATEFORM("about:blank", "ハンドル所持オブジェクト", True, 0, 540, 360, 0 ,0)
  obj.Document.write(form)
  OLEEVENT(obj.Document.body.all["hlist"], "HTMLSelectElementEvents2", "onclick", "fucOnClick")
  CtrlWin(GETID(GET_FORM_WIN), ACTIVATE)
  Rectan("<#DBL><#DBL>")
  while obj.Visible
     if GetKeyState(VK_ESC) then break
     Sleep(0.1)
  wend
  CtrlWin(GETID(GET_FORM_WIN), NOTOPMOST)
  Rectan("")
Finally
  CtrlWin(dbg_id, NORMAL)
EndTry
// --- main end ---

// ハンドル再帰所得
CONST LVL_MARK = " > "   // Level indication
CONST MAX_LENGTH = 64    // Maximum number of characters
Procedure HndInfo(id, lvl)
   if lvl = 0
      s = ""
   else
      s = (Status(id,ST_CLX)-Status(fpid,ST_CLX))+", "+(Status(id,ST_CLY)-Status(fpid,ST_CLY))+", "+Status(id,ST_WIDTH)+", "+Status(id,ST_HEIGHT)+", "
   endif
   titl = Status(id,ST_TITLE)
   if Length(titl)>MAX_LENGTH then titl = Copy(titl,1,MAX_LENGTH)+"..."
   s = s +"<#DBL>"+ Status(id,ST_CLASS) +"<#DBL>, <#DBL>"+ titl +"<#DBL>"
   if Pos(s, form)>0 then Exit
   form = form + "<option>" + Format(LVL_MARK,lvl*Length(LVL_MARK)) + s + "</option>"
   lcnt = lcnt + 1
   for n = 0 to GETALLWIN(id)-1
       HndInfo(ALL_WIN_ID[n], lvl+1)
   next
Fend

// クリックされた
Procedure fucOnClick()
   if ! Status(fpid, ST_ISID) then Exit
   Rectan(GETFORMDATA("hlist"))   // Draw rectangle
Fend

// 赤四角描画
DEF_DLL GetDC(Hwnd):long:user32
DEF_DLL ReleaseDC(Hwnd, Long):long:user32
DEF_DLL SelectObject(long, long):long:gdi32
DEF_DLL Rectangle(long, long, long, long, long):long:gdi32
DEF_DLL CreatePen(long, long, long):long:gdi32
DEF_DLL GetStockObject(long):long:gdi32
DEF_DLL DeleteObject(long):long:gdi32
CONST PS_SOLID = 0
CONST NULL_BRUSH = 5
Procedure Rectan(s)
   CtrlWin(fpid, NOTOPMOST)      // Clear old line
   CtrlWin(GETID(GET_FORM_WIN), TOPNOACTV)
   if s = "" then Exit
   dc = GetDC(0)
   pen = CreatePen(PS_SOLID, 3, $0000FF)
   SelectObject(dc, pen)
   SelectObject(dc, GetStockObject(NULL_BRUSH))
   if Copy(s, 1, 1) = "<#DBL>"    // Top Level
      x1 = Status(fpid,ST_CLX)
      y1 = Status(fpid,ST_CLY)
      x2 = x1 + Status(fpid,ST_CLWIDTH)
      y2 = y1 + Status(fpid,ST_CLHEIGHT)
   else
      s = Replace(s, Trim(LVL_MARK), "")  // Delete Level mark
      ary = Split(s, ",", True, True)
      x1 = ary[0] + Status(fpid,ST_CLX)
      y1 = ary[1] + Status(fpid,ST_CLY)
      x2 = x1 + ary[2]
      y2 = y1 + ary[3]
   endif
   Rectangle(dc, x1, y1, x2, y2)
   DeleteObject(pen)
   ReleaseDC(0, dc)
Fend
UWSC
// 指定ウィンドウの全オブジェクトの文字を種類別に取得
// "ボタン", "リスト/コンボ", "タブ", "メニュー", "ツリービュ", "リストビュ", "エディト", "リンク",
//  "スタテック文字", "ACCクリック可", "ACCテキスト", "ツールバー", "ステータスバー"
// (注:IEに適用すると ITM_STATUSBAR, ITM_TOOLBARにて IE側でエラーが出る事がある)
//

dbg_id = GETID("UWSC Debugger","TFOya")
CtrlWin(dbg_id, MIN)
Try
  Fukidasi("オブジェクトの文字を種類別に取得<#CR>  ウィンドウにカーソルを合わせから Shiftキーを押してください<#CR>  キャンセル: ESCキー")
  Repeat
     if GetKeyState(VK_ESC) then Exit
     Sleep(0.02)
  Until GetKeyState(VK_SHIFT)
  Fukidasi()

  Option OPTFINALLY
  thread chkESC()
  dim oname[] = "ボタン", "リスト/コンボ", "タブ", "メニュー", "ツリービュ", "リストビュ", "エディト", "リンク", "スタテック文字", "ACCクリック可", "ACCテキスト", "ACCエディト", "ツールバー", "ステータスバー"
  dim okind[] =  ITM_BTN, ITM_LIST, ITM_TAB, ITM_MENU, ITM_TREEVEW, ITM_LSTVEW, ITM_EDIT, ITM_LINK, ITM_STATIC, ITM_ACCCLK, ITM_ACCTXT, ITM_ACCEDIT, ITM_TOOLBAR, ITM_STATUSBAR
  CONST MAX_LENGTH = 64    // Maximum number of characters
  fpid = GETID(GET_FROMPOINT_WIN)
  Fukidasi("サーチ中  (キャンセル:ESCキー)", 0, 0)
  ACW(fpid)
  lcnt = 0
  form = "<select name='hlist' size='_DEF_SIZE_'>"
  for x = 0 to Length(oname)-1
     form = form + "<optgroup label='" + oname[x] + "'>"
     for y = 0 to GETITEM(fpid, okind[x])-1
        s = ALL_ITEM_LIST[y]
        if Length(s)>MAX_LENGTH then s = Copy(s,1,MAX_LENGTH)+"..."
        form = form + "<option>" + s + "</option>"
        lcnt = lcnt + 1
    next
     form = form + "</optgroup>"
     lcnt = lcnt + 1
  next
  form = form + "</select>"
  form = Replace(form, "_DEF_SIZE_", lcnt)
  Fukidasi()
  obj = CREATEFORM("about:blank", "種類別オブジェクト文字", True, 0, 540, 360, 0 ,0)
  obj.Document.write(form)
  CtrlWin(GETID(GET_FORM_WIN), ACTIVATE)
  while obj.Visible
     Sleep(0.1)
  wend
Finally
  CtrlWin(dbg_id, NORMAL)
EndTry
// --- main end ---

// ESCキーによる終了
Procedure chkESC()
   while True
      if GetKeyState(VK_ESC) then ExitExit
      Sleep(0.1)
   wend
Fend
UWSC
// PosAcc関数にて画面をサーチし情報取得
// "X, Y, 幅, 高さ, ACC_ACC/ACC_API, ACC_NAME, ACC_VALUE"  (位置はクライアント座標)
//

CONST DEF_XW = 20   // Matrix size X
CONST DEF_YH = 8    // Matrix size Y

dbg_id = GETID("UWSC Debugger","TFOya")
CtrlWin(dbg_id, MIN)
Try
  Fukidasi("POSACCにて画面をサーチし情報を取得<#CR>  ウィンドウにカーソルを合わせから Shiftキーを押してください<#CR>  キャンセル: ESCキー")
  Repeat
     if GetKeyState(VK_ESC) then Exit
     Sleep(0.02)
  Until GetKeyState(VK_SHIFT)
  Fukidasi()

  CONST MAX_LENGTH = 64  // Maximum number of characters
  PUBLIC fpid
  fpid = GETID(GET_FROMPOINT_WIN)
  Fukidasi("サーチ中  (キャンセル:ESCキー)", 0, 0)
  ACW(fpid)
  hashtbl tbl
  for y = DEF_YH/2 to Status(fpid,ST_CLHEIGHT) step DEF_YH
     for x = DEF_XW/2 to Status(fpid,ST_CLWIDTH) step DEF_XW
        if GetKeyState(VK_ESC) then Exit
        MMV(Status(fpid,ST_CLX)+x, Status(fpid,ST_CLY)+y)
        if GETID(GET_FROMPOINT_WIN) <> fpid then Continue
        loc = PosAcc(fpid, x, y, ACC_LOCATION or ACC_BACK)
        if tbl[loc, HASH_EXISTS] then Continue
        s1=PosAcc(fpid,x,y,ACC_BACK); if Length(s1)>MAX_LENGTH then s1=Copy(s1,1,MAX_LENGTH)+"..."
        s2=PosAcc(fpid,x,y,ACC_NAME or ACC_BACK); if Length(s2)>64 then s2=Copy(s2,1,MAX_LENGTH)+"..."
        s3=PosAcc(fpid,x,y,ACC_VALUE or ACC_BACK); if Length(s3)>64 then s3=Copy(s3,1,MAX_LENGTH)+"..."
        tbl[loc] = s1+", "+s2+", "+s3
     next
  next
  Fukidasi()

  if Status(fpid, ST_WIN64)
     form = "X, Y, 幅, 高さ, ACC_ACC, ACC_NAME, ACC_VALUE" // 64bit: not support ACC_API
  else
     form = "X, Y, 幅, 高さ, ACC_ACC/ACC_API, ACC_NAME, ACC_VALUE"
  endif
  form = form + "<BR><select name='hlist' size='_DEF_SIZE_'>"
  lcnt = 0
  for n = 0 to Length(tbl)-1
     vs = tbl[n, HASH_VAL]
     if Trim(Replace(vs, ",", "")) = "" then Continue
     form = form + "<option>" + tbl[n, HASH_KEY] +", "+ vs + "</option>"
     lcnt = lcnt + 1
  next
  form = form + "</select>"
  if lcnt < 2 then lcnt = 2
  form = Replace(form, "_DEF_SIZE_", lcnt)
  obj = CREATEFORM("about:blank", "ACC 情報サーチ", True, 0, 540, 360, 0 ,0)
  obj.Document.write(form)
  OLEEVENT(obj.Document.body.all["hlist"], "HTMLSelectElementEvents2", "onclick", "fucOnClick")
  CtrlWin(GETID(GET_FORM_WIN), ACTIVATE)
  Rectan("<#DBL><#DBL>")
  while obj.Visible
     if GetKeyState(VK_ESC) then break
     Sleep(0.1)
  wend
  CtrlWin(GETID(GET_FORM_WIN), NOTOPMOST)
  Rectan("")
Finally
  CtrlWin(dbg_id, NORMAL)
EndTry
// --- main end ---

// クリックされた
Procedure fucOnClick()
   if ! Status(fpid, ST_ISID) then Exit
   Rectan(GETFORMDATA("hlist"))   // Draw rectangle
Fend

// 赤四角描画
DEF_DLL GetDC(Hwnd):long:user32
DEF_DLL ReleaseDC(Hwnd, Long):long:user32
DEF_DLL SelectObject(long, long):long:gdi32
DEF_DLL Rectangle(long, long, long, long, long):long:gdi32
DEF_DLL CreatePen(long, long, long):long:gdi32
DEF_DLL GetStockObject(long):long:gdi32
DEF_DLL DeleteObject(long):long:gdi32
CONST PS_SOLID = 0
CONST NULL_BRUSH = 5
Procedure Rectan(s)
   CtrlWin(fpid, NOTOPMOST)      // Clear old line
   CtrlWin(GETID(GET_FORM_WIN), TOPNOACTV)
   if s = "" then Exit
   dc = GetDC(0)
   pen = CreatePen(PS_SOLID, 3, $0000FF)
   SelectObject(dc, pen)
   SelectObject(dc, GetStockObject(NULL_BRUSH))
   if Copy(s, 1, 1) = "<#DBL>"    // Top Level
      x1 = Status(fpid,ST_CLX)
      y1 = Status(fpid,ST_CLY)
      x2 = x1 + Status(fpid,ST_CLWIDTH)
      y2 = y1 + Status(fpid,ST_CLHEIGHT)
   else
      ary = Split(s, ",", True, True)
      x1 = ary[0] + Status(fpid,ST_CLX)
      y1 = ary[1] + Status(fpid,ST_CLY)
      x2 = x1 + ary[2]
      y2 = y1 + ary[3]
   endif
   Rectangle(dc, x1, y1, x2, y2)
   DeleteObject(pen)
   ReleaseDC(0, dc)
Fend

sampleにあるプログラム

  • sample
    • Calc.uws
    • Excel.uws
    • GruGru.uws
    • IEFlash.uws
    • IEtoExcel.uws
    • サンプル.uws
    • システム情報.uws
    • タイトルクラス.uws
    • タスクトレイ.uws
    • ディレクトリ木.uws
    • バックグラウンド.uws
    • ポップアップメニュ.uws
    • メール送信.uws
    • 音声認識.uws
    • 画像保存.uws
    • 計算フォーム.uws
    • 入力フォーム.uws
    • 文字情報.uws
    • 文字変換.uws
  • Calc.uws
  • Excel.uws
  • GruGru.uws
  • IEFlash.uws
  • IEtoExcel.uws
  • サンプル.uws
  • システム情報.uws
  • タイトルクラス.uws
  • タスクトレイ.uws
  • ディレクトリ木.uws
  • バックグラウンド.uws
  • ポップアップメニュ.uws
  • メール送信.uws
  • 音声認識.uws
  • 画像保存.uws
  • 計算フォーム.uws
  • 入力フォーム.uws
  • 文字情報.uws
  • 文字変換.uws
UWSC
// フォームを使用した電卓

while True
   btn = CREATEFORM("Calc.mht", "電卓", False, FOM_NOHIDE, 380, 440)
   if btn = "close" then break
   wks = GETFORMDATA("equation")
   if btn = "dot" then btn = "."
   if (wks="") and (btn=".") then btn = "0."
   if (wks="") and (val(btn)<0) then continue
   ifb btn = "C"                  // クリア
       SETFORMDATA("", "equation")
       SETFORMDATA("", "answer")
       continue
   endif
   wks = wks + btn
   try
     a = eval(wks)  // 演算
   except
     a = ""     // 不正演算
   endtry
   SETFORMDATA(wks, "equation")  // 式
   SETFORMDATA(a, "answer")      // 答え
wend


//
// Calc.mht は以下のhtmlを 画像を埋め込む為に mhtに変換したものです
//
// <html><body style="overflow:hidden;"><form method="POST">
//   <input type="text" name="equation"size="30" readonly> =
//   <input type="text" name="answer" size="12" readonly><p><p>
//   <input type="image"  src="p7.jpg" alt="7" name="7">
//   <input type="image"  src="p8.jpg" alt="8" name="8">
//   <input type="image"  src="p9.jpg" alt="9" name="9">
//   <input type="image"  src="pdiv.jpg" alt="/" name="/"><p>
//   <input type="image"  src="p4.jpg" alt="4" name="4">
//   <input type="image"  src="p5.jpg" alt="5" name="5">
//   <input type="image"  src="p6.jpg" alt="6" name="6">
//   <input type="image"  src="pmuti.jpg" alt="*" name="*"><p>
//   <input type="image"  src="p1.jpg" alt="1" name="1">
//   <input type="image"  src="p2.jpg" alt="2" name="2">
//   <input type="image"  src="p3.jpg" alt="3" name="3">
//   <input type="image"  src="pmins.jpg" alt="-" name="-"><p>
//   <input type="image"  src="p0.jpg" alt="0" name="0">
//   <input type="image"  src="ppuls.jpg" alt="+" name="+">
//   <input type="image"  src="pdot.jpg" alt="." name="dot">
//   <input type="image"  src="pc.jpg" alt="CLEAR" name="C"><p>
// </form></body></html>
UWSC
// Excelに値を書込み、その後に変更されたセルがあるかをチェック

CONST CELLSU = 30           // セルの大きさ
try
  Excel = XLOPEN(True)      // Excel起動
except
  MSGBOX("Excelがありません")
  Exit
endtry
DIM sdat[CELLSU, CELLSU]    // マトリックス作成
for y = 1 to CELLSU
    for x = 1 to CELLSU
        sdat[x,y] = "X"+x+":Y"+y
    next
next
XLSETDATA(Excel, sdat, "B2")        // B2 から設定
MSGBOX("適当にセルを変更したら、OKを押して下さい")
gdat = XLGETDATA(Excel, "B2:AE31")  // B2 からCELLSU(30)分読込み
fcnt = 0
for y = 1 to CELLSU
    for x = 1 to CELLSU
        ifb sdat[x,y] <> gdat[x,y]  // セルが変更されたか
            fcnt = fcnt + 1
            print x+":"+y+"="+gdat[x,y]
        endif
    next
next
ifb fcnt = 0 
    print "変更されたセルはありませんでした"
else
    print fcnt + "個のセルが変更されました"
endif
MSGBOX("保存せずに終了します")
XLCLOSE(Excel, True)
UWSC
if GETID("電卓",, 0.1) < 0 then EXEC("calc")
ACW(GETID("電卓"),107,101)
MMV(239,110,20)
MMV(240,110,81)
MMV(240,110,0)
MMV(241,110,20)
ACW(0,109,101,0,0,0)
MMV(245,110,10)
ACW(0,110,101,0,0,0)
MMV(249,110,20)
ACW(0,114,101,0,0,0)
MMV(256,110,20)
ACW(0,118,101,0,0,0)
MMV(264,110,10)
ACW(0,125,101,0,0,0)
MMV(270,110,20)
ACW(0,133,101,0,0,0)
MMV(277,111,20)
ACW(0,139,101,0,0,0)
MMV(281,113,20)
ACW(0,146,102,0,0,0)
MMV(293,113,10)
ACW(0,150,104,0,0,0)
MMV(300,115,20)
ACW(0,162,104,0,0,0)
MMV(311,116,20)
ACW(0,169,106,0,0,0)
MMV(320,119,10)
ACW(0,180,107,0,0,0)
MMV(331,123,20)
ACW(0,189,110,0,0,0)
MMV(344,127,20)
ACW(0,200,114,0,0,0)
MMV(357,132,10)
ACW(0,213,118,0,0,0)
MMV(364,138,20)
ACW(0,226,123,0,0,0)
MMV(380,139,20)
ACW(0,233,129,0,0,0)
MMV(389,147,10)
ACW(0,249,130,0,0,0)
MMV(398,152,20)
ACW(0,258,138,0,0,0)
MMV(408,156,20)
ACW(0,267,143,0,0,0)
MMV(415,162,10)
ACW(0,277,147,0,0,0)
MMV(420,168,20)
ACW(0,284,153,0,0,0)
MMV(422,175,20)
ACW(0,289,159,0,0,0)
MMV(423,183,20)
ACW(0,291,166,0,0,0)
MMV(424,192,10)
ACW(0,292,174,0,0,0)
MMV(424,201,20)
ACW(0,293,183,0,0,0)
MMV(424,210,20)
ACW(0,293,192,0,0,0)
MMV(424,220,10)
ACW(0,293,201,0,0,0)
MMV(423,230,20)
ACW(0,293,211,0,0,0)
MMV(421,241,20)
ACW(0,292,221,0,0,0)
MMV(417,252,10)
ACW(0,290,232,0,0,0)
MMV(411,261,20)
ACW(0,286,243,0,0,0)
MMV(406,270,20)
ACW(0,280,252,0,0,0)
MMV(399,279,10)
ACW(0,275,261,0,0,0)
MMV(390,287,20)
ACW(0,268,270,0,0,0)
MMV(382,295,20)
ACW(0,259,278,0,0,0)
MMV(381,301,10)
ACW(0,251,286,0,0,10)
MMV(379,308,10)
ACW(0,250,292,0,0,0)
MMV(378,316,21)
ACW(0,248,299,0,0,0)
MMV(377,322,20)
ACW(0,247,307,0,0,0)
MMV(371,328,10)
ACW(0,246,313,0,0,0)
MMV(355,336,20)
ACW(0,240,319,0,0,0)
MMV(345,342,20)
ACW(0,224,327,0,0,0)
MMV(335,349,10)
ACW(0,214,333,0,0,0)
MMV(319,354,20)
ACW(0,204,340,0,0,0)
MMV(312,354,20)
ACW(0,188,345,0,0,0)
MMV(303,355,10)
ACW(0,181,345,0,0,0)
MMV(292,355,20)
ACW(0,172,346,0,0,0)
MMV(276,356,20)
ACW(0,161,346,0,0,0)
MMV(270,355,10)
ACW(0,145,347,0,0,0)
MMV(263,355,20)
ACW(0,139,346,0,0,0)
MMV(255,354,20)
ACW(0,132,346,0,0,0)
MMV(248,351,10)
ACW(0,124,345,0,0,0)
MMV(240,349,20)
ACW(0,117,342,0,0,0)
MMV(237,346,20)
ACW(0,109,340,0,0,0)
MMV(234,345,20)
ACW(0,106,337,0,0,0)
MMV(230,344,10)
ACW(0,103,336,0,0,0)
MMV(223,342,20)
ACW(0,99,335,0,0,0)
MMV(212,338,20)
ACW(0,92,333,0,0,0)
MMV(206,333,10)
ACW(0,81,329,0,0,0)
MMV(198,328,20)
ACW(0,75,324,0,0,0)
MMV(198,328,10)
ACW(0,67,319,0,0,0)
MMV(192,322,10)
MMV(187,318,10)
ACW(0,61,313,0,0,0)
MMV(178,313,20)
ACW(0,56,309,0,0,0)
MMV(174,306,20)
ACW(0,47,304,0,0,0)
MMV(169,300,10)
ACW(0,43,297,0,0,0)
MMV(164,294,20)
ACW(0,38,291,0,0,0)
MMV(160,289,20)
ACW(0,33,285,0,0,0)
MMV(157,284,20)
ACW(0,29,280,0,0,0)
MMV(155,278,10)
ACW(0,26,275,0,0,0)
MMV(153,271,20)
ACW(0,24,269,0,0,0)
MMV(152,263,20)
ACW(0,22,262,0,0,0)
MMV(151,255,10)
ACW(0,21,254,0,0,0)
MMV(151,247,20)
ACW(0,20,246,0,0,0)
MMV(151,236,20)
ACW(0,20,238,0,0,0)
MMV(151,224,10)
ACW(0,20,227,0,0,0)
MMV(151,213,20)
ACW(0,20,215,0,0,0)
MMV(151,204,20)
ACW(0,20,204,0,0,0)
MMV(151,196,10)
ACW(0,20,195,0,0,0)
MMV(153,186,21)
ACW(0,20,187,0,0,0)
MMV(154,177,20)
ACW(0,22,177,0,0,0)
MMV(156,168,10)
ACW(0,23,168,0,0,0)
MMV(159,160,20)
ACW(0,25,159,0,0,0)
MMV(162,153,20)
ACW(0,28,151,0,0,0)
MMV(166,147,10)
ACW(0,31,144,0,0,10)
MMV(171,142,10)
ACW(0,35,138,0,0,0)
MMV(174,137,20)
ACW(0,40,133,0,0,0)
MMV(177,134,20)
ACW(0,43,128,0,0,0)
MMV(180,131,10)
ACW(0,46,125,0,0,0)
MMV(183,128,20)
ACW(0,49,122,0,0,0)
MMV(189,124,20)
ACW(0,52,119,0,0,0)
MMV(194,121,10)
ACW(0,58,115,0,0,0)
MMV(199,118,20)
ACW(0,63,112,0,0,0)
MMV(204,116,20)
ACW(0,68,109,0,0,0)
MMV(208,114,10)
ACW(0,73,107,0,0,0)
MMV(211,113,20)
ACW(0,77,105,0,0,0)
MMV(213,113,20)
ACW(0,80,104,0,0,0)
MMV(215,112,10)
ACW(0,82,104,0,0,0)
MMV(217,111,20)
ACW(0,84,103,0,0,0)
MMV(222,110,20)
ACW(0,86,102,0,0,0)
MMV(232,109,10)
ACW(0,91,101,0,0,0)
MMV(240,109,20)
ACW(0,101,100,0,0,0)
MMV(248,111,20)
ACW(0,109,100,0,0,0)
MMV(255,113,20)
ACW(0,117,102,0,0,0)
MMV(260,115,10)
ACW(0,124,104,0,0,0)
MMV(264,116,20)
ACW(0,129,106,0,0,0)
MMV(269,117,20)
ACW(0,133,107,0,0,0)
MMV(276,117,10)
ACW(0,138,108,0,0,0)
MMV(279,118,20)
ACW(0,145,108,0,0,0)
MMV(280,118,20)
ACW(0,148,109,0,0,0)
ACW(0,149,109,0,0,0)
MMV(280,118,0)
MMV(280,119,30)
UWSC
// IEの中のFlashPlayerの操作 (YouTube:20秒間だけ再生)
// IE10では Flashは内臓の為にハンドルを取得できない

// YouTube - Sweet Tired Cat
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://www.youtube.com/watch?v=hPzNl6NKAG0")
BusyWait(IE)
// FlashPlayerActiveX のID取得
id = GETID("YouTube", "IEFrame")
hnd = GETCTLHND(id, "MacromediaFlashPlayerActiveX", 2)
if hnd = 0 then hnd = GETCTLHND(id, "MacromediaFlashPlayerActiveX", 1)
if hnd = 0
   MsgBox("FlashPlayerActiveX のハンドルを取得できませんでした")
   Exit
endif
flashid = HNDtoID(hnd)
x = status(flashid, ST_X)
y = status(flashid, ST_Y)
h = status(flashid, ST_HEIGHT)
MMV(x+8, y+h-8)
sleep(1)
print "Flashの位置: "+ x +","+ y
print "ビデオ時間: "+ GETSTR(flashid, 1, STR_ACC_STATIC)
Repeat
  Sleep(0.5)
  MMV(x+8, y+h-8-RANDOM(8))    // コントロール部が閉じないように揺らす
Until Copy(GETSTR(flashid, 1, STR_ACC_STATIC),1,3) = "0:2"   // 20sec
print "PAUSE"
ClkItem(flashid, "Pause", CLK_ACC or CLK_MUSMOVE, True)
//------
Procedure BusyWait(ie)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! ie.busy) and (ie.readyState=4)
  Sleep(0.5)
Fend
UWSC
// Yahoo! ファイナンスを開き 指定株価時系列データを取得してExcelに送る

IE = CREATEOLEOBJ("InternetExplorer.Application")  // IE
IE.Visible = True
kcode = "4689.t"          // 銘柄コード
yys=2012; mms=1; dds=1    // 開始年月日
yye=2012; mme=3; dde=1    // 終了年月日
url = "http://info.finance.yahoo.co.jp/history/?code="+kcode+"&sy="+yys+"&sm="+mms+"&sd="+dds+"&ey="+yye+"&em="+mme+"&ed="+dde+"&tm=d="
IE.Navigate(url)
BusyWait(IE)
Excel = XLOPEN(True)      // Excel起動
Excel.Range("A1").ColumnWidth = 16 // A列の幅
dim head[] = "日付","始値","高値","安値","終値","出来高","調整後終値"
XLSETDATA(Excel, head, "A1")

// データ取得
body = IEGetSrc(IE, "BODY")
body = Copy(body, Pos("調整後終値*",body))     // 取得開始位置
body = Copy(body, 1, Pos("</TBODY>",body))     // 取得終了位置
num = Length(SPLIT(body, "</tr>"))-2           // 行数
dim sdat[num][7]
cnt = 1
for y = num to 1 step -1
  for x = 1 to 7     // 列
        sdat[y][x] = BetweenStr(body, "<td>", "</td>", cnt)
        cnt = cnt + 1
  next
next
XLSETDATA(Excel, sdat, "A2")  // 一括で設定
Excel.ActiveSheet.Name = IEGetData(IE,"TAG=H1")  // シート名に企業名

// グラフ作成
CONST xlColumns = 2
CONST xlLine = 4
RunGraph = Excel.ActiveSheet.ChartObjects.Add(440,10,400,400).Chart
RunGraph.ChartType = xlLine
rng = Excel.Range("A1","E"+num)
RunGraph.SetSourceData(Source:=rng, PlotBy:=xlColumns)


//------
Procedure BusyWait(ie)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! ie.busy) and (ie.readyState=4)
  Sleep(0.5)
Fend
UWSC
// サンプル

if KINDOFOS() < 21       // Windows7 未満
   msgbox("ごめんなさい。<#CR>このサンプルは Windows7 以上の必要があります。")
   Exit
endif
Speak("Run the sample script", True)

// メッセージ表示位置
PUBLIC msgx, msgy
msgx = MONITOR(0, MON_WIDTH) / 2    // メインモニタの真ん中
msgy = MONITOR(0, MON_HEIGHT) / 2

// マウス、キーボード入力をブロックする
StopForm(False)                 // Stopウィンドウは出さない
LockHardEX(0, LOCK_MOUSE)       // マウス禁止

// Paint 全画面表示
paintid = paintimg()

// メモ帳 起動
メモID = EXEC(GET_SYS_DIR+"\notepad.exe", False, 200, 10, 400, 400)
if Pos("メモ帳", Status(メモID, ST_TITLE)) = 0
   msgbox("Japanese-Windows only")
   Exit
endif

// メモ帳 フォントの変更
ClkItem(メモID, "フォント", CLK_MENU or CLK_SHORT)
fontid = GETID("フォント", "#32770", 3)
if fontid<0 then fontid = GETID("Font", "#32770")
sv_fontStyl = GETSTR(fontid, 2)       // 現在のスタイル
sv_fontSize = GETSTR(fontid, 3)       // 現在のサイズ
ClkItem(fontid, "太字", CLK_LIST)     // スタイル変更
SendStr(fontid, "16", 3, True)        // サイズ変更 (ClkItemでも可)
Sleep(1)
ClkItem(fontid, "OK")

// 計算式をメモ帳に書き込み
計算式 = "12345+98765="
SendStr(メモID, 計算式)
Sleep(1)

// 電卓で計算
電卓ID = EXEC(GET_SYS_DIR+"\calc.exe")
if KINDOFOS() < 30                       // Windows7, 8
   ClkItem(電卓ID, "普通の電卓")
   SendStr(電卓ID, 計算式)
   Sleep(1)
   ret = GetStr(電卓ID, 4, STR_STATIC)
else                                            // Windows10 ストアアプリ
   電卓ID = GETID("電卓", "ApplicationFrameWindow")
   for modebtn in GetItem(電卓ID, ITM_BTN)      // 現在のモードを調べる
       if Pos("メニュー、", modebtn)>0
          if Pos("標準", modebtn)=0             // 標準 電卓に切り替え
             ClkItem(電卓ID, modebtn, CLK_BTN)
             sleep(1)
             ClkItem(電卓ID, "標準 電卓", CLK_LIST or CLK_LEFTCLK)
          endif
          break
       endif
   next
   for n in 計算式                 // 1文字づつクリック
      if n = "+" then n = "プラス"
      if n = "=" then n = "等号"
      ClkItem(電卓ID, n)
   next
   Sleep(1)
   ret = GetStr(電卓ID, 2, STR_STATIC)
   Token(" ", ret)
endif
SendStr(メモID, ret+"<#CR>")       // メモ帳に答えを追加

// 電卓回す
SendStr(メモID, "電卓をグルグル回してみる<#CR>")
if  MsgBox("回してみます?", BTN_YES or BTN_NO) = BTN_YES
    moji = "音楽を入れますか?<#CR>Yesなら5秒以内に Shift キーを押してね"
    if  音楽を入れるかキーチェック(VK_SHIFT, moji)
        musicnm = "flourish.mid"
        Balloon("読み込み中...", msgx, msgy)
        Sound(musicnm)                       // バックミュージック
        Balloon()
    endif
    for 回数 = 1 to 3
       if 回数=2 then Balloon("いつもより余計に回しています<#cr>パチパチパチ"_
                  , msgx, msgy-20, 3, 14)        // _により前行と繋がっている
       call .\grugru.uws                         // grugru.uws を実行
    next
else
    Balloon("それは残念", msgx, msgy, 0, 14)
    Sleep(3)
endif

// 終了処理
Balloon("フォントの変更を戻す")
ClkItem(メモID, "フォント", CLK_MENU or CLK_SHORT) // フォントの変更を戻す
fontid = GETID("フォント", "#32770", 3)
if fontid<0 then fontid = GETID("Font", "#32770")
SendStr(fontid, sv_fontStyl, 2, True)     // スタイル戻す
SendStr(fontid, sv_fontSize, 3, True)     // サイズ戻す
Sleep(1)
ClkItem(fontid, "OK")
CtrlWin(paintid, CLOSE2)                  // Paint終了
Sound()                       // SOUND OFF
Balloon()                                 // 吹出しOFF
CtrlWin(電卓ID, CLOSE)                    // 電卓終了
SendStr(メモID, "終了~")
Sleep(1)
CtrlWin(メモID, CLOSE)                    // メモ終了
Sleep(1)
ClkItem(GETID("メモ帳", "#32770"), "保存しない")
LockHardEX()                              // 入力ブロックの解除
// メイン処理はここまでになる(関数の前まで)



// 以下 関数(サブルーチン)

// 指定キーが押されたらTrueを返す
Function 音楽を入れるかキーチェック(chk_key, moji)
   Result = False                       // 戻り値
   sv_tm = GetTime()
   while GetTime()-sv_tm < 5            // 5秒まで待つ
       wk_sec = 5 - (GetTime()-sv_tm)
       Balloon(moji+" "+wk_sec, msgx, msgy, 0, 14)
       if  GETKEYSTATE(chk_key)         // 指定キーチェック
        Result = True                // 戻り値=True
      break
       endif
       sleep(0.2)
   wend
   Balloon()                            // 吹出しOFF
fend


// usertile12.bmp/user-200.png/user-192.pngを Paintで表示
Function paintimg()
   Result = 0
   Const dpath = "C:\ProgramData\Microsoft\User Account Pictures\"
   img = dpath + "Default Pictures\usertile12.bmp"  // Win7
   if  ! FOPEN(img, F_EXISTS)
       img = dpath + "user-200.png"                 // Win8
       if ! FOPEN(img, F_EXISTS)
          img = dpath + "user-192.png"              // Win10
          if ! FOPEN(img, F_EXISTS) then exit       // 無し
       endif
   endif
   id = exec("mspaint.exe <#DBL>"+ img +"<#DBL>")
   sleep(1)
   ClkItem(id, "表示", CLK_ACC)
   ClkItem(id, "全画面", CLK_ACC or CLK_BACK)
   sleep(1)
   Result = id                    // IDを返す
Fend
UWSC
// APIによりシステム情報(コンピュータ名、ユーザ名)の取得
// WMIによるBIOS、マザーボード情報の取得

DEF_DLL GetComputerNameA(var string, var Long): Long: kernel32
DEF_DLL GetUserNameA(var string, var Long): Long: advapi32
ComName = Format(NULL, 100)   // 領域確保
UserName = Format(NULL, 100)
GetComputerNameA(ComName, Length(ComName))
GetUserNameA(UserName, Length(UserName))
print "コンピュータ名:" + ComName
print "ユーザ名:" + UserName
print


// BIOS情報の表示
Locator = CreateOleObj("WbemScripting.SWbemLocator")
consvr = Locator.ConnectServer()
biosset = consvr.ExecQuery("Select * From Win32_BIOS")
GETOLEITEM(biosset); wk = ALL_OLE_ITEM[0]
print "BIOS情報:"
print wk.Manufacturer
print wk.Name
print wk.SerialNumber
print wk.SMBIOSBIOSVersion
print
// マザーボード情報の表示
baseset = consvr.ExecQuery("Select * From Win32_BaseBoard")
GETOLEITEM(baseset); wk = ALL_OLE_ITEM[0]
print "マザーボード情報:"
print wk.Manufacturer
print wk.Product
print wk.SerialNumber
print wk.Version
UWSC
// マウスカーソル下のウィンドウのタイトルとクラス名を表示

While True
  id = GETID(GET_FROMPOINT_WIN)    // マウスカーソル下のウィンドウ
  moji = STATUS(id, ST_TITLE) + " , " + STATUS(id, ST_CLASS)
  Fukidasi(moji, G_MOUSE_X+8, G_MOUSE_Y, 3)
  Sleep(0.2)
Wend
UWSC
// タスクトレイの音量を右クリックしボリュームコントロールを開く
// Win9x系はNG

flg = CLKITEM(GETID("","Shell_TrayWnd"), "音量", CLK_TOOLBAR or CLK_RIGHTCLK)
if !flg then flg = CLKITEM(GETID("","Shell_TrayWnd"), "Volume", CLK_TOOLBAR or CLK_RIGHTCLK)  // 環境により "音量" or "Volume"
ifb flg
    popupid = GETID("", "#32768", -1)  // コンテキストメニュー
    CLKITEM(popupid, "開く", CLK_ACC or CLK_SHORT or CLK_BACK or CLK_MUSMOVE)
endif
UWSC
// C:ドライブのディレクトリ木表示(3階層まで)

ディレクトリ("C:", 0)

procedure ディレクトリ(dd, lve)
  lve = lve + 1
  if lve > 3 then Exit
  sps = ""
  for i = 2 to lve;  sps = sps + "  ";  next
  for i=0 to GETDIR(dd,"\")-1
     print sps + GETDIR_FILES[i]
     ディレクトリ(dd+"\"+GETDIR_FILES[i], lve)
  next
fend
UWSC
// バックグランドのメモ帳にKBD関数にてランダム文字を書く

id = EXEC("notepad.exe")
edithnd = GETCTLHND(id, "edit") // 送るべきウィンドウ(注:親ではない)
MOUSEORG(HndToID(edithnd), 2)  // バックグラウンド指定
calc = EXEC("calc.exe")     // 電卓前面(メモ帳をバックグラウンドに)
ACW(calc, STATUS(id,ST_X), STATUS(id,ST_Y)+80)
for i = 0 to 60
    KBD(VK_A+RANDOM(26))  // 文字ランダム
    Sleep(0.1)
next
UWSC
// デスクトップの情報を取得しポップアップメニュにする

id = GETID("Program Manager","Progman")
GETITEM(id, ITM_LSTVEW)
x = POPUPMENU(ALL_ITEM_LIST)
CLKITEM(id, ALL_ITEM_LIST[x], CLK_LSTVEW or CLK_LEFTCLK)
CLKITEM(id, ALL_ITEM_LIST[x], CLK_LSTVEW or CLK_DBLCLK)
UWSC
// CDOを利用したメール送信

Const SMTP_SERVER = "mail.xxx.yyy.zzz"  // メールサーバー
Const SMTP_PORT = 587                   // ポートNo.
Const SMTP_AUTHEN = 1                   // SMTP認証: 0:なし、1:basic、2:NTLM
Const SMTP_SSL = True                   // SSL利用
Const SMTP_ID = "xxxxx"                 // ID
Const SMTP_PASWD = "yyyyy"              // Password
Const MAILFROM = "from@xxx.yyy.zzz"     // 送信者メールアドレス


MailTo = "to@xxx.yyy.zzz"               // あて先メールアドレス
mailSubj = "題名"                       // 題名
MailBody = "内容"                       // 内容


Const cdoPath = "http://schemas.microsoft.com/cdo/configuration/"
Const cdoSendUsingPort = 2
objCDO = CreateOLEObj("CDO.Message")
With objCDO
    With .Configuration.Fields                           // 設定項目
        .Item(cdoPath+"sendusing") = cdoSendUsingPort    // 外部SMTP指定
        .Item(cdoPath+"smtpserver") = SMTP_SERVER        // SMTPサーバ名
        .Item(cdoPath+"smtpauthenticate") = SMTP_AUTHEN  // SMTP認証
        .Item(cdoPath+"smtpserverport") = SMTP_PORT      // ポートNo
        .Item(cdoPath+"smtpusessl") = SMTP_SSL           // SSL
        .Item(cdoPath+"sendusername") = SMTP_ID          // ID
        .Item(cdoPath+"sendpassword") = SMTP_PASWD       // Password
        .Item(cdoPath+"smtpconnectiontimeout") = 60      // タイムアウト
        .Update                                          // 設定を更新
    EndWith
    .MimeFormatted = True
    .Fields.Update
    .From = MAILFROM
    .To = MailTo
    .Subject = mailSubj
    .TextBody = MailBody
    .Send
EndWith
UWSC
// 音声認識によるアプリの操作

// アクティブウィンドウのクリック可能なものを拾得、それを単語登録し使用
// 認識可能な単語は吹き出しにて表示
// コマンド発声前にShiftキーを叩いておくとチェックボックス等でOFF動作
id = -1
dim 単語登録[100]
While True
  ifb id <> GETID(GET_ACTIVE_WIN)  // アクティブウィンドウが変更されたか
      id = GETID(GET_ACTIVE_WIN)
      num = GETITEM(id, ITM_BTN+ITM_LIST+ITM_TAB+ITM_MENU+ITM_LSTVEW+ITM_TREEVEW+ITM_TOOLBAR,-1,0,True)  // クリック可能なものを全て拾う
      if num > resize(単語登録) then num = resize(単語登録)   // 数制限
      ifb num = 0
          Sleep(0.2);  Continue
      endif
      表示 = ""
      SETCLEAR(単語登録, "")
      for i = 0 to num-1
          単語登録[i] = 記号削除(ALL_ITEM_LIST[i])  // 邪魔な文字は削除
          if 単語登録[i]<>"" then 表示 = 表示 + 単語登録[i] + "<#CR>"
      next
      RECOSTATE(True, 単語登録)    // 単語登録、実行
      Fukidasi(表示, 0, 0, , , , , ,100)
  endif
  拾得音声 = DICTATE(False)     // 拾得
  ifb 拾得音声 <> ""            // 音声入力あった
      Fukidasi()
      print 拾得音声
      for i = 0 to num-1
          ifb 拾得音声 = 単語登録[i]
              chk_flg = ! GETKEYSTATE(VK_SHIFT)  // Shiftキーが押されてた時は Off動作
              CLKITEM(id, ALL_ITEM_LIST[i], 0, chk_flg)  // コマンド実行
              break
          endif
      next
      id = -1
  else
      if GETKEYSTATE(VK_LBUTTON) then id = -1  // ボタン操作があった時も更新
  endif
  Sleep(0.2)
Wend

// 制御コードなどの記号があるとエラーになるのでゴミ文字削除
Function 記号削除(ss)
  p = Pos("\", ss)
  if p > 0 then ss = Copy(ss, p+1, 999)
  ifb Pos("\", ss) > 0
      Result="";  Exit  // 階層化されている物まで拾うと数が多すぎになるので捨てる
  endif
  p = Pos("(", ss, -1)
  if p > 0 then ss = Copy(ss, 1, p-1)  // ( 以降は消す
  for i = 1 to Length(ss)
      mcd = ASC(Copy(ss,i,1))          // 英数字のチェック
      ifb mcd < $80
          if (mcd<$30) or (mcd>$7A) or ((mcd>=$3A)and(mcd<=$40)) or ((mcd>=$5B)and(mcd<=$60)) then ss=Copy(ss,1,i-1)+" "+Copy(ss,i+1,999)
      endif
  next
  Result = Replace(ss, " ", "")
Fend
UWSC
// Shiftキーが押された時にマウス位置200ドットの画像を保存

CONST BMPNAME = "画像保存.BMP"
wshell = CreateOLEObj("WScript.Shell")
While True
   ifb GETKEYSTATE(VK_SHIFT)
       SAVEIMG(BMPNAME, 0, ZCUT(G_MOUSE_X-100), ZCUT(G_MOUSE_Y-100), 200, 200)
       wshell.Run(BMPNAME)    // BMPに割り当てられたアプリ起動
       Break
   endif
   Sleep(0.2)
Wend
UWSC
// スクリプト内のTextBlockに書かれたHTMLをフォーム表示する

obj = CREATEFORM("about:blank", "Calc", True, FOM_NOHIDE, 460, 200)
obj.Document.write(計算フォーム)      // HTMLを書き込む
while obj.Visible                     // 画面が出ている間
 ifb GETFORMDATA("CalBtn")           // 計算ボタンが押された
  va = VAL(GETFORMDATA("Text1"))
  vb = VAL(GETFORMDATA("Text2"))
  ifb (val(va)=ERR_VALUE) or (val(vb)=ERR_VALUE)
   MsgBox("数値を入れてください"); Continue
  endif
  select GETFORMDATA("Select1")
   case "足し算"; ret = va + vb
   case "引き算"; ret = va - vb
   case "掛け算"; ret = va * vb
  selend
    obj.Document.body.all.tags("font").item[0].innerText = ret
 endif
 Sleep(0.1)
wend

// 計算フォーム.html
TextBlock 計算フォーム
 <html><body style="overflow:hidden;"><form method="POST">
  <input type='text' name='Text1' size='8'>
  <select name='Select1'><option>足し算</option><option>引き算</option><option>掛け算</option></select>
  <input type='text' name='Text2' size='8'>
  <input type='submit' value=' 計算 ' name='CalBtn'><BR><BR>
  <font color='#FF0000'>答え</font>
 </form></body></html>
EndTextBlock
UWSC
// フォーム(入力画面)を出し、入力された値を表示

btn = CREATEFORM("testform.html", "タイトル", False, 0, 400, 480)
print "押されたボタン(Submit)= " + btn

print "text(一行)= "+ GETFORMDATA("Text1")

wks = "チェックボックス="
if GETFORMDATA("Check1") then wks = wks + "  aaaa"
if GETFORMDATA("Check2") then wks = wks + "  bbbb"
print wks

if GETFORMDATA("Radio1", "V1") then print "ラジオボタン= 1111"
if GETFORMDATA("Radio1", "V2") then print "ラジオボタン= 2222"

print "セレクトボックス= "+ GETFORMDATA("D1")  // 複数時はTAB区切り

print "text(複数行)= "+ GETFORMDATA("S1")
UWSC
// マウス位置の文字情報を取得

While True
  x = G_MOUSE_X; y = G_MOUSE_Y     // マウス位置
  id = GETID(GET_FROMPOINT_WIN)     // アクティブウィンドウ
  ofx = x - STATUS(id, ST_CLX)      // 相対位置
  ofy = y - STATUS(id, ST_CLY)
    wks = PosACC(id, ofx, ofy)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_NAME)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_VALUE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_ROLE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_STATE)
    wks = wks + "<#cr>" + "x="+ofx+", y="+ofy
  Fukidasi(wks, x+10, y+10, 3)
  Sleep(0.5)
Wend
UWSC
// 入力された文字を全角大文字にしてメモ帳に表示していく

CONST 漢数字 = "一二三四五六七八九"
メモID = EXEC("notepad.exe")
While True
    wks = INPUT("何か文字を入れて下さい")
    if wks = EMPTY then break
    wks = STRCONV(wks, SC_UPPERCASE or SC_FULLWIDTH)
    for i = 1 to 9                                      // 数字は漢数字に
        wks = Replace(wks, CHR(ASC("0")+i), Copy(漢数字,i,1))
    next
    SENDSTR(メモID, wks+"<#CR>")
Wend

Font / Color

UWSC_Debugger_FontColor.png

エディタのフォントと色を設定します。

Tab
タブ幅を指定します。
Font
フォントを指定します。
Font Color
ベースの文字色を設定します。
Background
背景色を指定します。
構文
構文(その他項目)の文字色を指定。
定数
定数(その他項目)の文字色を指定。
特殊変数
特殊変数(その他項目)の文字色を指定。
コメント
コメント部分(ダブルスラッシュ)箇所の文字色を指定。
UWSC関数
UWSC関数(その他項目)の文字色を指定。
文字列
ダブルクォーテーション("文字列")で囲まれた範囲の文字色を指定。

太字斜体にする場合はチェックボックスにチェックを入れます。

Uws2Exe

Uws2Exe.png

UWSCファイルをEXEファイルにします。EXE化後は単体での実行が可能で、ライセンスフリーにて配布できます。

完成したスクリプトまたは改竄かいざんされたくないスクリプトをEXE化するときに使います。

UWSCをインストールしていない環境でも実行することができます。

EXE化するスクリプトを指定してください
EXE化するファイルを指定またはウィンドウ上にドラッグします。複数ファイルで構成されている場合は、トップのスクリプトを指定します。
CALL文で呼ばれるファイル、CREATEFORM関数のHTMLファイル、CHKIMG関数の画像ファイルは自動で取り込まれます、変数でファイル名が指定されている場合は取り込みません。
(HTML画面に関しては下記HTML画面使用にてを参照)
アイコンの変更
アイコンを変更するときはチェックを入れ、拡張子が*.ICOのファイルを指定してください。PNG、JPEG、GIF、BMPの画像をアイコンに変更するには以下のリンクを利用してください。 チェックを入れない場合はC:\Program Files (x86)\UWSC\exeuws.exeのアイコンが使われます。
STOPボタンを出さない
画面上にSTOPボタンを出しません。
タスクバーに出さない
タスクバー上にアイコンを出しません。
CREATEFORM関数によりフォームを作成した場合はフォームのアイコンは出ます)
INIファイルを作らない
INIファイルを作成しません。
作成を許可している場合はUWSC.INIからPosition(位置)StopHotKey(停止ホットキー)LogLines(ログ行数)DefaultFont(フォント)の情報をコピーします。
ログファイルを作らない
PRINT文で表示される情報を保存しません。
BMPファイルを取り込まない
CHKIMG関数にて使用するBMPファイルを取り込みません。
多重起動を許さない
多重起動を禁止します。多重起動を禁止にしているときに多重起動すると、後に開いたEXEファイルは強制終了します。
実行ファイルを圧縮する
upxを利用してサイズを約3分の1にできます。
uws2exe.INIUpxPath=upx.exeのあるフォルダを記述することによりupxが使用できます。
バージョン情報
EXEのプロパティに埋め込まれるバージョン情報を設定します。
UWSファイルの中にコメント形式にて設定することもできます。
(下記バージョン情報の設定を参照。)

EXE化したものは単体で動作可能になります。
EXE化したものはライセンスフリーであり配布等は自由です。

UPX: the Ultimate Packer for eXecutables - HomepageにあるDownload latest releaseのリンクでGitHubのページが開くので、upx-4.2.1-win64.zipをダウンロードしてください。

HTML画面使用にて(複数ファイルで構成されているとき)

画像やCSSファイルがある場合もしくはマルチフレームの場合、htmlからmhtに変換して1ファイルにしてください。
(IEで表示してからファイル->名前を付けて保存でファイルの種類にてWebアーカイブ、単一のファイル(*.mht)を選択して保存)

バージョン情報の設定

UWSファイルの中にコメント形式にて設定できます。ここで指定した内容はEXE化するスクリプトを指定したときに自動的にバージョン情報の項目に適用されます。同じ項目を複数記述した場合は、より後に書かれた方が適用されます。

以下の内容をEXE化するスクリプトの先頭に記述しておきます。

UWSC
// _EXEVERSION = 数値.数値.数値.数値
// _FILEDESCRIPTION = ファイルの説明
// _PRODUCTNAME = 製品名
// _LEGALCOPYRIGHT = 著作権

実行停止について

INIファイルの作成が有効の場合には、UWSCの停止ホットキーと同じキーが引き継がれます。

他の停止方法としては、タスクバーのアイコン上で右クリックして閉じる(C)を選択、またはSETHOTKEY関数にて定義してください。

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

PROCEDURE forceQuit()
	EXITEXIT
FEND

コマンドラインからの起動

オプションは/もしくは-の後に連続で表記します。オプションは順不同で指定できます。

オプション内容
SSTOPボタンを出さない
Tタスクバーに出さない
IINIファイルを作らない
Lログファイルを作らない
BBMPファイルを取り込まない
M多重起動を許さない
UEXEファイルをの圧縮(uws2exe.INIのUpxPath=にupx.exeのあるパスを記述)
E画面を出さずにEXE化処理の実行
EXE化するスクリプトの指定
変更するアイコンの指定

記述例

コマンドプロンプト
uws2exe.exe /SI c:\temp\a.uws      // STOPボタン,INIファイル,画面表示
uws2exe.exe /SIE c:\temp\a.uws      // STOPボタン,INIファイル,即実行
uws2exe.exe c:\temp\a.uws c:\temp\a.ico // アイコンの変更、デフォルトのオプション

バージョンは0.0.0.0999.999.999.999まで指定できます。

バージョンはメジャーバージョン.マイナーバージョン.ビルドバージョン.リビジョンのように表します。

バージョン 意味
メジャーバージョン 根本から変更したとき
マイナーバージョン 大幅な仕様変更・機能を加えたとき
ビルドバージョン 小さな仕様変更・機能を加えたとき
リビジョン バグの修正等

.は区切り文字であり小数を表しているわけではありません。そのため1.0.0.9にバグ修正を加えた場合は1.0.1.0ではなく、1.0.0.10となります。

上位の数字が加えられた場合、下位の数字は0に戻します。

最初は1.0.0.0を指定します。

UWSC Free版でEXEファイルを作成する方法

IExpress(C:\Windows\System32\iexpress.exe)を使うことで、EXEファイルを作成することが可能です。

  1. ファイル名を指定して実行やコマンドプロンプトからiexpress.exeを入力し、IExpress Wizardを起動します。

  2. Create new SelfExtraction Directive file.を選択し次へ

  3. Package purposeと表示されるのでExtract files and run an installation commandを選択し次へ

  4. Package titleと表示されるので、タイトルを入力し次へ

  5. Confirmation promptと表示されるので、No prompt.を選択し次へ

  6. License agreementと表示されるので、Do not display a license.を選択し次へ

  7. Paclaged filesと表示されるので、Addをクリックし、まずUWSC.exeを追加し次にEXE化したいUWSファイルを選択します。UWSC.exeC:\Program Files (x86)\UWSC\UWSC.exeにあります。追加が終わったら次へ

  8. Install Program to Launchと表示されるので、Install ProgramUWSC.exe <UWSファイル名.uws>を入力します。Post Install Command<None>を選択し次へ

  9. Show windowと表示されるので、Default (recommended)を選択し次へ

  10. Finished messageと表示されるので、No message.を選択し次へ

  11. Package Name and Optionsと表示されるので、作成したEXEファイルの保存先を入力もしくはBrowseで指定。OptionsStore files using Long File Name inside Packageにチェックを入れダイアログが表示されるのではいを選択し次へ

  12. Configure restartと表示されるので、No restartを選択し次へ

  13. これまでの設定内容を保存する場合はSave SelfExtraction Directive (SED) file:を選択し、保存先のパスを入力もしくはBrowseから指定。

  14. Create packageと表示されるので次へ

  15. 完了を選択し終了します。

Cross Reference(XRef・クロスリファレンス)

UWSC Debuggerの[Option]->[Cross Reference]から起動。保存されていないファイルの場合は実行できません。ファイルを保存してから実行します。

変数や関数が使われている行番号を一覧で出力します。宣言・定義はしているのに利用されていない変数や関数は赤字で表示されます。

UWSC Cross Reference.png
読み込みファイル
Cross Referenceに読み込まれているファイルのパス
MODULE定義
モジュールが定義されている行。モジュール名のみで内部に定義された関数名は表示されません。
ユーザー関数
ユーザー関数・モジュールが定義・呼び出されている行。モジュール内で定義された関数はモジュール名.関数名のように表示されます。
CONST変数
CONSTで定数が宣言されている行。
PROTECTED変数(MODULE内定義)
モジュール内で宣言された変数。
LOCAL変数
ローカル変数が宣言されている行。先頭にargがついている変数は自作関数内で値を受け取り利用するために宣言された変数(仮引数)。値を受け取った行番号はなぜか実際の値よりも-1されている。

参考文献

  1. バージョンの考え方