VB2005から起動したExcelの移動、サイズ変更のイベントがハンドルしたくて、次のようなコードを作ってみました。
コンパイル、動作においてエラーは出ないのですが、肝心要のオーバーライドしたWndProcが全く無反応です。
どこか足らない箇所があるのでしょうか? どうぞよろしくお願いいたします。
Public Class Form1
Dim xlapp As New Microsoft.Office.Interop.Excel.Application
Dim win As New exWin
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.xlapp.Visible = True
Me.win.AssignHandle(Me.xlapp.Hwnd)
End Sub
End Class
Public Class exWin
Inherits NativeWindow
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Console.WriteLine("!")
MyBase.WndProc(m)
End Sub
End Class
> どこか足らない箇所があるのでしょうか?
MSDN の「NativeWindow.AssignHandle メソッド」の項には、
下記の記述がありますよ。
》 メモ :
》 別のアプリケーション プロセスのハンドルを割り当てることはできません。
>MSDN の「NativeWindow.AssignHandle メソッド」の項には、下記の記述がありますよ。
その通りでした。やはりWin32APIを使うしか無いみたいですね。
VB6に関する記事はいくつかあるんですが、.Net以降のものは見つからずに・・・
SetWindowLongの使い方がミソであるところまでは調べたんですが、デリゲートとLongの相違に悩まされています。
どこかに良い参考記事はないでしょうか?
VB全く使わないので分かりませんが、VB2005ってグローバルフックってできましたっけ?
MSAAのEVENT_SYSTEM_MOVESIZESTART拾うくらいならできるのかも???
とーりすがーり様
>VB2005ってグローバルフックってできましたっけ?
これが難しいらしいのです。どこかしこの記事を調べても「DLLでないとグローバルフックはできない」という断り書きがあります。
これをやりたいが為だけにC++を勉強する工数も割けず・・・。
VB2005でもローレベルフックならいけるみたいですね。
それを使って処理できるかどうかは別として。
VCでDLL作らないとなると、あとはExcel側でローカルフック仕掛けてそれをキックするとか??
そもそもVBAでローカルフックできるかどうかは知りませんが。
個人的にはVCでDLL作っちゃった方が早い気がします。
Excel.Application の Top/Left/Width/Height プロパティを
Timer で監視して、変化があったときに処理を行うようにするとか。
魔界の仮面弁士さま
>Timer で監視して、変化があったときに処理を行う
サンプルで作成してみました。監視するだけの機能ならば問題ないようです。
しかし、その他にも通信、DB制御などなどが加わったときにどうなるか・・・。マシンスペックにも大きく依存しそうで一抹の不安はありますが、純粋にVBだけだと、それが最も無難な手段のようです。
その他の処理でTimerイベントを使わなければ、何とかなるかな?
何ともならなければ、とーりすがーり様のご指摘の通り、VCに取り組むことにします。
色々とアドバイスありがとうございました。
この問題は、この時点で解決とさせていただきます。
ツイート | ![]() |