Wave 1.0.1
フォルダの画像をクリックすれば、ダウンロード出来ます。
====================================================================
Wave (WaveEngine)
UWSC風 簡易マクロ自動化システム
Version1.0.1
Author: Tatsuyadev
====================================================================
--------------------------------------------------------------------
【1. 概要】
--------------------------------------------------------------------
Wave(WaveEngine)は、UWSC風の簡易マクロ言語を解釈・実行する
Windows / Delphi(VCL) 製の操作自動化ツールです。
・マウス操作/キーボード入力/待機/条件分岐/繰り返しを
スクリプト(.wave)で記述し、自動再生できます。
・実際の操作をグローバルフックで記録し、.wave スクリプトを
自動生成できます(レコーダー)。
・座標シミュレーションだけでなく、OLEプロトコルによる「本物の
ファイルドラッグ&ドロップ」に対応しています。
・式の中で値を返す組み込み関数(ウィンドウ検索・文字列・数値
変換など)と、ユーザー定義関数(FUNCTION〜FEND)を備えます。
本システムは GUI ホストアプリ(Wave.exe)で
構成されます。
ホストアプリの動作:
・「読込」で .wave を開き、「保存」で UTF-8 の .wave として
保存(拡張子は自動補正)。
・「再生」はスクリプトを別スレッドで実行し、UI のフリーズや
エンジン内 SLEEP の巻き込みを防止。
・「記録」で記録開始/停止をトグルし、停止時に生成スクリプトを
プレビュー表示。
--------------------------------------------------------------------
【2. システムの特徴】
--------------------------------------------------------------------
■ スクリプト言語
・UWSC 風の簡易マクロ言語。1 行 1 命令、// 行コメント対応。
・拡張子は .wave 固定、文字コードは UTF-8。
・変数は動的型(数値は内部 Double、必要に応じ文字列と相互変換)。
未定義の識別子はその名前自体を文字列リテラルとして扱う。
■ 式評価エンジン(TExprParser)
・算術(+ - * /)、比較(== <> < > <= >=、= も等価比較)、
文字列連結(+)、丸括弧、単項マイナスに対応。
・両辺が数値のときのみ算術・数値比較。片方でも文字列なら
連結/文字列比較になる。
・式の中で組み込み関数・ユーザー定義関数を呼び出せる。
■ 制御構文
・IF/ELSE/ENDIF、FOR/TO/STEP/NEXT、WHILE/WEND をサポート。
・いずれもネスト可能。
・実行はプログラムカウンタ(PC)方式で、各命令が次に実行する
PC を設定してジャンプを実現。
■ 操作コマンド
・クリック系(CLICK / RCLICK / DBLCLICK / MMV)、ドラッグ系
(DRAG / RDRAG)、ファイル D&D(FILEDROP)、キー入力
(INPUT)、待機(SLEEP / WAIT)、出力(PRINT)。
■ 組み込み関数(式内で値を返す)
・ウィンドウ操作: GETID / WAITWND / WAITCLOSE / ACW / GETTITLE
・文字列: LENGTH / COPY / POS / REPLACE / TRIM / UPPER / LOWER /
CHR / ASC
・数値・型変換: VAL / STR / INT / ABS / RANDOM
・関数名は大文字小文字を区別しない。
■ ユーザー定義関数(FUNCTION〜FEND)
・スクリプト内で自前の関数を定義可能。戻り値は RESULT に代入。
・呼び出しごとにローカル変数辞書を生成(値渡し・ローカルスコープ)。
・再帰可(深度 100 まで)。定義位置は任意(実行前に一括登録)。
■ ホスト連携
・Delphi 側から TWaveInterpreter.RegisterFunction で独自の
組み込み関数を追加登録できる(TWaveFunc 型の匿名関数)。
・PRINT の出力先を OnPrint コールバックで差し替え可能
(未設定時は OutputDebugString へ "[WAVE] " 付きで出力)。
■ 操作記録(WaveRecorder)
・WH_MOUSE_LL / WH_KEYBOARD_LL のグローバルフックでシステム
全体の操作を捕捉し、.wave を自動生成。
・押下位置と解放位置の距離を OS のドラッグ判定しきい値
(SM_CXDRAG / SM_CYDRAG)と比較して CLICK と DRAG を自動判別。
・印字可能キーの連続入力は INPUT に、一定以上の操作間隔は
SLEEP にまとめる。
・記録スレッドは STA で COM 初期化され、エクスプローラーからの
ファイルドラッグは Shell.Application で選択ファイルの
フルパスを取得して FILEDROP として記録する。
■ 本物のファイルドラッグ&ドロップ(WaveOleDragDrop)
・IDataObject(CF_HDROP)/IDropSource/DoDragDrop を実装し、
多くのアプリが期待する OLE D&D プロトコルで実ファイルを渡す。
・DragAcceptFiles のみのレガシーウィンドウにも、OS 内蔵の
橋渡しシム経由で概ね対応。
■ 実行モデル
・再生はホスト側で別スレッド実行し、UI のフリーズを回避。
--------------------------------------------------------------------
【3. 対応構文・コマンドリファレンス】
--------------------------------------------------------------------
3.1 基本構文
--------------------------------------------------------------------
・1 行に 1 つの命令を記述する。
・コメントは // から行末まで。
・拡張子は .wave 固定(LoadAndExecuteFile が検証)。UTF-8 で保存。
3.2 変数・代入
--------------------------------------------------------------------
var 名前 = 式 var キーワードを使った代入
名前 = 式 var を省略した代入(どちらも可)
例:
var x = 10
y = x + 5
name = "Taro"
3.3 演算子・式
--------------------------------------------------------------------
算術 : + - * /
比較 : == <> < > <= >= (= 単独も等価比較として扱う)
文字列 : + による連結(数値と文字列が混在すると文字列扱い)
括弧 : ( ) によるグルーピング
単項 : 前置の - (単項マイナス)
・両辺が数値のときのみ算術・数値比較を行う。
・片方でも文字列なら + は連結、比較は文字列比較になる。
・未定義変数はその識別子自身を文字列リテラルとして扱う。
・数値の内部表現は Double(整数値は小数点なしで出力)。
3.4 制御構文
--------------------------------------------------------------------
IF condition THEN
...
ELSE (省略可)
...
ENDIF
FOR 変数 = 開始 TO 終了 [STEP 増分]
...
NEXT
WHILE condition
...
WEND
・IF はブロック形式のみ(単行 IF...THEN 命令は非対応)。
・IF / FOR / WHILE はネスト可能。
・対応する開始命令が無い ENDIF / NEXT / WEND はパース時に例外。
3.5 コマンド一覧
--------------------------------------------------------------------
CLICK(x, y) 左クリックを実行する。
RCLICK(x, y) 右クリックを実行する。
DBLCLICK(x, y) ダブルクリック(短い間隔で CLICK を2回)。
MMV(x, y) クリックせずカーソルを移動するのみ。
DRAG(x1, y1, x2, y2) 左ボタンでドラッグ(15 段階で移動→解放)。
アプリ内操作向けの座標シミュレーション。
実ファイルのデータは伴わない。
RDRAG(x1, y1, x2, y2) 右ボタン版の DRAG。
FILEDROP(x, y, "f1", ...) 本物のファイルを OLE D&D で座標 (x, y) に
ドロップ。パスは複数指定可。内部で
WaveOleDragDrop.ExecuteFileDragDrop を呼ぶ。
INPUT "文字列" 文字列をキーボード入力として送信
(SendInput + KEYEVENTF_UNICODE)。
SLEEP(ミリ秒) / WAIT(ミリ秒) 指定ミリ秒だけ待機(両者は同一動作)。
PRINT 式 式を評価してデバッグ出力する。OnPrint が
あればそちらへ、無ければ OutputDebugString。
3.6 組み込み関数(式内で値を返す)
--------------------------------------------------------------------
● ウィンドウ検索・待ち合わせ系
GETID("タイトル" [, "クラス名"] [, 完全一致])
ウィンドウを検索してハンドル(整数)を返す。無ければ -1。
第2引数でクラス名でも絞り込み、第3引数 1 で完全一致
(省略/0 で部分一致)。可視ウィンドウを EnumWindows で走査。
WAITWND("タイトル", タイムアウト秒 [, 完全一致])
出現するまで待つ。出現でハンドル、時間切れで -1。
0 以下なら無期限。内部は 100ms 間隔ポーリング。
WAITCLOSE(id, タイムアウト秒)
指定ウィンドウが閉じるまで待つ。閉じたら 1、時間切れで 0。
ACW(id)
指定ウィンドウを前面化・アクティブ化(最小化なら復元)。
成功 1、無効なら 0。
GETTITLE(id)
ウィンドウのタイトル文字列を返す。無効なら空文字。
● 文字列関数
LENGTH(s) 文字列の長さ。
COPY(s, start, count) 部分文字列。start は 1 始まり。count 省略で
末尾まで。
POS(部分, s [, n]) 出現位置(1 始まり、無ければ 0)。第3引数 n で
n 番目の出現を検索。
REPLACE(s, 検索, 置換) s 内の検索文字列をすべて置換。
TRIM(s) 前後の空白(スペース・タブ・改行)を除去。
UPPER(s) / LOWER(s) 大文字化 / 小文字化。
CHR(コード) 文字コードから 1 文字を返す。
ASC(s) 先頭文字の文字コードを返す(空なら 0)。
● 数値・型変換関数
VAL(s) 文字列を数値に変換(不可なら 0)。
STR(n) 数値を文字列に変換。
INT(n) 小数点以下を切り捨て(0 方向)。
ABS(n) 絶対値。
RANDOM(n) 0 以上 n 未満の整数乱数(n<=0 なら 0)。
● ホスト側からの独自関数追加
TWaveInterpreter.RegisterFunction(名前, 実装) で、TWaveFunc 型
(TArray<TExprValue> を受け取り TExprValue を返す匿名関数)の
独自組み込み関数を追加登録できる。
3.7 ユーザー定義関数(FUNCTION〜FEND)
--------------------------------------------------------------------
FUNCTION 関数名(引数1, 引数2, ...)
... 本体(任意のコマンド・制御構文)...
RESULT = 戻り値
FEND
・呼び出しは式の中で行う: x = 関数名(値1, 値2)
・戻り値は本体内で特殊変数 RESULT に代入した値。未設定なら空文字。
・関数内の変数はローカルスコープ(呼び出しごとに独立)。
・引数は値渡し。実引数が少ない場合、不足分は空文字。
・再帰可(深度 100 まで)。ネスト定義は不可。
・定義位置は任意(実行前に一括登録される)。
例:
FUNCTION Fact(n)
IF n <= 1 THEN
RESULT = 1
ELSE
RESULT = n * Fact(n - 1)
ENDIF
FEND
PRINT Fact(5) // 120
3.8 サンプル
--------------------------------------------------------------------
var count = 0
FOR i = 1 TO 5
CLICK(100, 200)
SLEEP(300)
count = count + 1
NEXT
PRINT "clicked " + count + " times"
id = WAITWND("電卓", 10)
IF id <> -1 THEN
ACW(id)
SLEEP(200)
CLICK(150, 300)
ELSE
PRINT "電卓が起動しませんでした"
ENDIF
--------------------------------------------------------------------
【4. 制限事項・仕様上の注意点】
--------------------------------------------------------------------
■ 言語・式
・IF は単行形式(IF...THEN 命令)に非対応。ブロック形式のみ。
・文字列リテラルはエスケープシーケンス非対応。二重引用符を含む
文字列は表現できない(レコーダーは単引用符へ自動置換して回避)。
・未定義変数はエラーにならず識別子名の文字列として扱われるため、
変数名のタイプミスに気づきにくい。
・数値は内部的にすべて Double。厳密な整数演算・桁数には注意。
■ 関数
・組み込み関数/ユーザー定義関数の呼び出しは式内でのみ有効。
戻り値を使わない単独行の関数呼び出しは、代入や条件式の一部
として書く必要がある。
・未知の関数名を呼び出してもエラーにならず空文字を返す
(タイプミスに気づきにくい)。
・ユーザー定義関数はネスト定義できない(FUNCTION 内 FUNCTION 不可)。
・再帰は深度 100 まで(超えると「呼び出しが深すぎます」例外)。
・ユーザー定義関数はローカルスコープのみ。グローバル変数を関数内
から読み書きする仕組みは無く、参照渡し(var 引数)も非対応。
必要な値は引数で渡し、結果は RESULT で返す。
■ 操作・ドラッグ
・DRAG / RDRAG は座標シミュレーションのみで実ファイルのデータを
伴わない。実ファイルの受け渡しには FILEDROP を使うこと。
・FILEDROP の対象ウィンドウが、ドロップを一切受け付けない設定
(IDropTarget も DragAcceptFiles も無い)や、特定のマウス操作
パターンのみ受理する独自実装の場合は反応しないことがある。
・マウスの「移動」自体は記録されない(クリック・ドラッグの
開始/終了座標のみ)。ドラッグ中の軌跡の再現は非対応。
■ 記録(レコーダー)
・同時に記録できる TWaveRecorder インスタンスは 1 つまで。
・FILEDROP の自動記録は、ドラッグ元が Windows エクスプローラーの
フォルダウィンドウ(CabinetWClass / ExploreWClass)で、かつ
ファイル選択済みの場合のみ。デスクトップアイコンや他アプリ
からのドラッグは通常の DRAG として記録される。
・ダブルクリックは自動検出せず、短い間隔の 2 回の CLICK として
記録される(再生結果は同等)。
■ 待機・タイミング
・WAITWND / WAITCLOSE は 100ms 間隔ポーリングで待機するため、
待機中はその分だけ処理がブロックされる。
・SLEEP 中はスクリプト実行スレッドが待機する(ホストは再生を
別スレッドで行うため UI 自体はフリーズしない)。
■ 権限・環境
・グローバルフックや OLE ドラッグ操作で、管理者権限で動作する
別アプリを対象にする場合、本アプリも管理者権限で実行する必要が
ある(Windows の UIPI 制約)。
・Windows / VCL 専用。API は Win32(SendInput, EnumWindows,
DoDragDrop, Shell.Application 等)に依存する。>
ソフト利用規定(ダウンロードする前にまずはお読みください)
・フリーソフトです。ただし、再配布する場合はサイトの何処かに、当サイトのトップページをリンクして下さい。
・
商用利用
の場合は当サイトのトップページから任意の金額を寄付して下さい。
・当プログラムを利用に当たって発生した如何なる損害が発生しましても責任は負えません。
自己責任でお願いします。
以上
Wave関連スレッド
Wave関連スレッド
👁 36
ログイン
/
新規登録
して投稿
▼
更新
掲示板トップ
[1]
Tatsuya◆OikIgfMabE
ID:
oQ71YGEw
質問、要望はこちらに宜しくお願いいたします。
2026/07/06(月) 21:49:57
[2]
Tatsuya◆OikIgfMabE
ID:
a59aa9c930c4
Wave 1.0.1
リリースしました。
追加した機能は多く説明が大変なので、
こちらから見て下さい。
https://developer-world.net/Wave/
2026/07/16(木) 03:39:54
▲
掲示板トップ
全部
名前:
独自タグ
メッセージ:
/3000
画像:
※jpg・jpeg・gif・png・mov・mp4のみ(9000000バイト以内で4枚まで)
今すぐ購入
投稿
名前:
独自タグ
メッセージ:
/3000
画像:
※jpg・jpeg・gif・png・mov・mp4のみ(9000000バイト以内で4枚まで)
PAGE BOTTOM