- note -

雑記



1/1

rundllexノウハウ   - Last modified:2013/3/9

batユーザーのためのrundllex(ある意味)入門編です。

1.batとの連携

これがあってこそのコマンドだと言えます。
bat → rundllexは簡単です。

[1-1] bat → rundllex

@echo off
setlocal

set hoge=ABC
rundllex puts,%hoge%
rundllex → batの場合、
単一の数値を返したいだけならこれも簡単です。

[1-2] rundllex → bat(数値)

@echo off
setlocal

rundllex {ret}-o17+0x19 exit,[ret]
echo;%errorlevel%
若干面倒なのが、rundllex内の文字列をbatの処理で使いたいケースです。
取り敢えず簡単に済ませたいなら、for /fで解析する方法が挙げられます。
selfcallも組み合わせておけばより無難な感じになります。

[1-3] rundllex → bat(文字列)

@echo off
setlocal

for /f delims^=^ eol^= %%I in ('rundllex free^,0 puts^,[__LES]') do (
  echo;%%I
)
また、hybridソースも一応書けます(ver1.3以降)。

[1-4] batとrundllexのhybridソース例

@rundllex %~f0 & exit /b
puts,Hello rundllex!
※ … これ以降のソースの行末に「^」があるのは、batやcmdにそのまま貼り付けて動かせるようにするため。rdxに貼り付ける場合はこの「^」を取り除く必要がある。また、batでは「()」のエスケープも必要。

2.ウィンドウ操作(※)

batやコマンドプロンプトでウィンドウを操作する方法です。
手始めにその辺に転がっているウィンドウのHWNDを取得してみましょう。
簡単に取得する方法として、以下の4つが考えられます。
FindWindow … 第二引数を0にして第一引数にCLASS名を指定するのも可。

[2-1] FindWindow()を使う

rundllex gets,{title}(128) {hWnd}FindWindow,0,[title]

[2-2] GetForegroundWindowを使う

rundllex Sleep,1500 {hWnd}GetForegroundWindow

[2-3] WindowFromPoint()を使う

rundllex Sleep,1500 GetCursorPos,{c}(8) {hWnd}WindowFromPoint,[*c],[*c.4]
GetKeyState … 左クリックをトリガーにしてWindowFromPoint。

[2-4] GetKeyState()も使う

rundllex loop:{lb}GetKeyState,1 Sleep,30 "-o[lb]>=0,loop"^
         GetCursorPos,{c}(8) {hWnd}WindowFromPoint,[*c],[*c.4]
HWND … 2-3と2-4の場合は取得対象によってGetParentの呼び出しが必要になる場合もある。 HWNDが取得できたら、まぁいろいろ制御できたり取得できたりが可能になります。
以下に示す例は全て2-2の方法を利用していますが、2-1,2-3,2-4のどれに置き換えてもOKです。

[2-5] ウィンドウを閉じる

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         SendMessage,[hWnd],16,0,0
隠す … 非表示にするだけで、閉じはしない。

[2-6] ウィンドウを隠す

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         ShowWindow,[hWnd],0

[2-7] ウィンドウを最小化する

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         ShowWindow,[hWnd],6

[2-8] ウィンドウの位置/サイズ取得

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         GetWindowRect,[hWnd],{r}(16)^
         {width}-o[*r.8]-[*r]^ {height}-o[*r.12]-[*r.4]^
         printf,x=%d\ny=%d\nwidth=%d\nheight=%d\n,[*r],[*r.4],[width],[height]

[2-9] ウィンドウの位置変更

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         SetWindowPos,[hWnd],0,10,10,0,0,5

[2-10] ウィンドウのサイズ変更

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         SetWindowPos,[hWnd],0,0,0,200,200,6

[2-11] ウィンドウの常時前面表示(トグル)

rundllex Sleep,1500 {hWnd}GetForegroundWindow^
         GetWindowLong,[hWnd],-20^
         -o[*-1]^&8 -o[*-1]/-8 -o[*-1]-1^
         SetWindowPos,[hWnd],[*-1],0,0,0,0,3

3.マウス操作

こっちはウィンドウ操作より簡単です。

[3-1] マウスカーソル位置の取得

rundllex GetCursorPos,{p}(8)^
         printf,x=%d\ny=%d\n,[*p],[*p.4]

[3-2] マウスカーソル位置の変更

rundllex SetCursorPos,500,100

[3-3] マウス左クリック

rundllex mouse_event,2,0,0,0,0 mouse_event,4,0,0,0,0

4.キーボード操作

パスワード自動入力とかで使えるかもしれません。

[4-1] ENTER押下

rundllex keybd_event,13,0,0,0 keybd_event,13,0,2,0

[4-2] 指定ウィンドウにWM_CHAR送信

rundllex Sleep,1500 GetCursorPos,{c}(8) {hWnd}WindowFromPoint,[*c],[*c.4]^
         SendMessage,[hWnd],0x102,65,0

5.iniファイル

xmlが面倒ならiniファイルが便利です。

[5-1] iniファイルへ書き込み(セクション:Hoge、キー:Piyo)

rundllex "WritePrivateProfileString,Hoge,Piyo,Fuga,#%cd%\test.ini"

[5-2] iniファイルから数値読み込み

rundllex "{n}GetPrivateProfileInt,Hoge,Piyo,0,#%cd%\test.ini"^
         printf,%d\n,[n]

[5-3] iniファイルから文字列読み込み

rundllex "GetPrivateProfileString,Hoge,Piyo,Default,{s}(32),32,#%cd%\test.ini^"
         puts,[s]

6.どーでもいい使い方

その他のネタ集です。

[6-1] 警告音

rundllex MessageBeep,16

[6-2] ロック(ミ田 + L)

rundllex LockWorkStation

[6-3] 管理者として実行

rundllex ShellExecute,0,runas,cmd,0,0,1

[6-4] 壁紙変更

rundllex SystemParametersInfo,20,0,#C:\hoge.bmp,3

[6-5] マウスカーソルの移動速度変更

rundllex SystemParametersInfo,113,0,20,0

[6-6] スクリーンセーバーを1秒発動設定に

rundllex SystemParametersInfo,15,1,0,0