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

解決


ana_zizou  2009-08-15 01:44:35  No: 101928

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-15 02:02:40  No: 101929

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

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

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


ana_zizou  2009-08-15 02:16:46  No: 101930

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

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

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

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

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


とーりすがーり  2009-08-17 23:58:04  No: 101931

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


ana_zizou  2009-08-18 01:28:13  No: 101932

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

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

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


とーりすがーり  2009-08-18 02:06:41  No: 101933

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

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


魔界の仮面弁士  2009-08-18 19:05:43  No: 101934

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


ana_zizou  2009-08-19 19:09:04  No: 101935

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

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

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

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

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

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


ana_zizou  2009-08-19 19:09:53  No: 101936

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加