プログラミング

WSHでWin32APIを呼び出す-その11

2005年7月10日

参考:SFC mini
(←戻る)
 さて、前の記事まででWndProcをコールバック関数に指定して、ここから別のVBscriptを別のプロセスとして呼び出すことで、Hello Worldプログラムを作成した。さて、もう少し高度なことが出来るかと考え、こちらのページを参考にさせて頂いて、色々とプログラミングしてみた。

 しかしである。いきなり問題が発生した。WinAPIのSetCaptureによりマウスをキャプチャーしようとしてみたが、これが出来ないのである。MSDN曰く、『この関数を使って、ほかのプロセスでマウスのキャプチャを開始することはできません。』ということらしい。今の方法では、WndProcの処理を別のプロセスで行っているため、この不都合が起きる。どうしたらよいだろうか。

 やはり、WndProcを別のプロセスで行うことには無理がある。他にも色々と出来ないことが出てくるだろう。やはり、同一プロセス内で処理する方法を考えないといけない。

 解決策として、自作DLLの中ではWndProcの際のhWnd, Msg, wParam, lParam を内容をキューに蓄えておき、とりあえずWndProcを終了させておいた。WndProcが終了した後に、DLLにWndProcの呼び出しがあったかどうかを問い合わせ、もしあった場合にキューに蓄えてあった4つの値を取り出すようにした。この新しい機能は、次のようにして使用することが出来る。まず、

'Set hWnd and Msg that must be tracked (all "QUE" mode)
Call DwSetTrackedHandleMsg(hWnd,WM_LBUTTONDOWN,1,0)
Call DwSetTrackedHandleMsghWnd,WM_LBUTTONUP,1,0)
Call DwSetTrackedHandleMsg(hWnd,WM_MOUSEMOVE,1,0)
Call DwSetTrackedHandleMsg(hWnd,WM_PAINT,1,0)
Call DwSetTrackedHandleMsg(hWnd,WM_DESTROY,1,0)

の様に記述して、トラックするメッセージを指定する。3つ目のパラメータはキューを使用するかどうか(0でCreateProcess使用、1でキューの使用)、4つ目のパラメータはキューを使用する時にDLL内のWndProcで使用される戻り値である。さらに、WndProcに制御が移る可能性のあるWinAPIを呼び出したあとに次のように記述する。

dim hWnd,uiMsg,wParam,lParam
do while DwCheckWndProcQue()
  hWnd=DwGetWndProcQue(0)
  uiMsg=DwGetWndProcQue(1)
  wParam=DwGetWndProcQue(2)
  lParam=DwGetWndProcQue(3)
  Call WndProc(hWnd,uiMsg,wParam,lParam)
loop

そのほかの部分は、今までと同じように使用することが出来る。

 これらの機能を用いてマウスの軌跡をウインドウに描画するプログラムを作成し、実行した結果が次の通りである。

一歩前進!

今回のプログラムはWndProcで新たなプロセスを作成しない分、動作が軽くなった感じである。少し良くなった。色々な機能を追加していく内に、VBscript内に共通の関数群の数が増えてきたので、これらをひとまとめにして、SFC (Subs, Functions, and Classes) for VBscriptと名付けることにした。

(ここで使用したサンプルプログラム及び、Ver0.11のSFCはここからダウンロードできます。)

(続く)

コメント

コメントはありません

コメント送信