ExcelのMoveイベントをハンドルするには?

解決


ana_zizou  2009-08-14 16:44:35  No: 101928  IP: 192.*.*.*

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

編集 削除
魔界の仮面弁士  2009-08-14 17:02:40  No: 101929  IP: 192.*.*.*

> どこか足らない箇所があるのでしょうか?

MSDN の「NativeWindow.AssignHandle メソッド」の項には、
下記の記述がありますよ。

》 メモ :  
》 別のアプリケーション プロセスのハンドルを割り当てることはできません。

編集 削除
ana_zizou  2009-08-14 17:16:46  No: 101930  IP: 192.*.*.*

>MSDN の「NativeWindow.AssignHandle メソッド」の項には、下記の記述がありますよ。

その通りでした。やはりWin32APIを使うしか無いみたいですね。

VB6に関する記事はいくつかあるんですが、.Net以降のものは見つからずに・・・

SetWindowLongの使い方がミソであるところまでは調べたんですが、デリゲートとLongの相違に悩まされています。

どこかに良い参考記事はないでしょうか?

編集 削除
とーりすがーり  2009-08-17 14:58:04  No: 101931  IP: 192.*.*.*

VB全く使わないので分かりませんが、VB2005ってグローバルフックってできましたっけ?
MSAAのEVENT_SYSTEM_MOVESIZESTART拾うくらいならできるのかも???

編集 削除
ana_zizou  2009-08-17 16:28:13  No: 101932  IP: 192.*.*.*

とーりすがーり様
>VB2005ってグローバルフックってできましたっけ?

これが難しいらしいのです。どこかしこの記事を調べても「DLLでないとグローバルフックはできない」という断り書きがあります。

これをやりたいが為だけにC++を勉強する工数も割けず・・・。

編集 削除
とーりすがーり  2009-08-17 17:06:41  No: 101933  IP: 192.*.*.*

VB2005でもローレベルフックならいけるみたいですね。
それを使って処理できるかどうかは別として。

VCでDLL作らないとなると、あとはExcel側でローカルフック仕掛けてそれをキックするとか??
そもそもVBAでローカルフックできるかどうかは知りませんが。
個人的にはVCでDLL作っちゃった方が早い気がします。

編集 削除
魔界の仮面弁士  2009-08-18 10:05:43  No: 101934  IP: 192.*.*.*

Excel.Application の Top/Left/Width/Height プロパティを
Timer で監視して、変化があったときに処理を行うようにするとか。

編集 削除
ana_zizou  2009-08-19 10:09:04  No: 101935  IP: 192.*.*.*

魔界の仮面弁士さま
>Timer で監視して、変化があったときに処理を行う

サンプルで作成してみました。監視するだけの機能ならば問題ないようです。

しかし、その他にも通信、DB制御などなどが加わったときにどうなるか・・・。マシンスペックにも大きく依存しそうで一抹の不安はありますが、純粋にVBだけだと、それが最も無難な手段のようです。

その他の処理でTimerイベントを使わなければ、何とかなるかな?

何ともならなければ、とーりすがーり様のご指摘の通り、VCに取り組むことにします。

色々とアドバイスありがとうございました。

編集 削除
ana_zizou  2009-08-19 10:09:53  No: 101936  IP: 192.*.*.*

この問題は、この時点で解決とさせていただきます。

編集 削除