アプリケーションをバックグラウンド制御する

こんな方法もあるのか、ということ。
クリックしたりキーボード入力したりは、MouseOrgの第二引数を2にすると、いろいろできますが、それでも前面に来ることもある。
仮想デスクトップにして、メッセージを飛ばして制御してしまえば、見ないで済む。
仮想デスクトップにしなくても、見ないで済むことが多いけど。




例えば、Acrobat Readerでバックグラウンド印刷するなら

DEF_DLL PostMessageA(Hwnd,Long,Long,Dword):Long:user32

hnd = IDTOHND(GETID("Adobe Reader"))
PostMessageA(hnd, $111, 6028, 0)	// WM_COMMAND 印刷

wid = GETID("印刷","#32770")
res = GETALLWIN(wid) - 1
FOR i = 0 TO res
	PRINT ALL_WIN_ID[i] + ": " + STATUS(ALL_WIN_ID[i], ST_TITLE)
	IFB STATUS(ALL_WIN_ID[i], ST_TITLE) = "OK" THEN
		PostMessageA(IDTOHND(wid), $111, 1, IDTOHND(ALL_WIN_ID[i]))
		BREAK
	ENDIF
NEXT


説明不要と思いますが、

  1. 印刷のメッセージを送って
  2. 印刷ダイアログから「OK」ボタン探して
  3. 印刷ダイアログに「OK」が押されたと通知

という流れです。


OKボタンの位置はハードコードでも良い気がするけど。
Virtual PCを使わずに、アプリケーションの制御ができる気がしてきた。
IDTOHNDが想像以上に便利。
最難関は、コマンドIDを調べる方法。


使える人は、Spy++やWinspectorか。
いや、「ChkCtlID.zip」が一番良さそうです。
http://siromasa.xxxxxxxx.jp/Sample/index.html
、、、でもOKボタンは、厳しい。
なにか、修正が必要な気がする。DLLに。