C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: IMessageFilterのメソッド


(過去ログ 86 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■51576 / inTopicNo.1)  IMessageFilterのメソッド
  
□投稿者/ ミキモト (1回)-(2010/07/09(Fri) 22:44:29)

分類:[VB.NET/VB2005 以降] 

VB.Net2008でWindowsアプリケーションを開発中です。

「IMessageFilter」の「RetryRejectedCall」メソッドを使用したいのですが、
ヘルプ(F1で表示される画面)をみても「PreFilterMessage」しか記載されていません。

VB.Net2008では「IMessageFilter」には「RetryRejectedCall」メソッド
はないのでしょうか?
引用返信 編集キー/
■51577 / inTopicNo.2)  Re[1]: IMessageFilterのメソッド
□投稿者/ Hongliang (672回)-(2010/07/09(Fri) 23:11:29)
Application.AddMessageFilter で使用する System.Windows.Forms.IMessageFilter インターフェイスにはそんなメソッドはありません。
COM のインターフェイス IMessageFilter にはありますけど、これは単にたまたま名前が同じというだけで、System.Windows.Forms.IMessageFilter とは関係ありません。
で、後者が欲しいのでしょうか? COM メソッドの呼び出しに時間が掛かりすぎてダイアログが出るのをどうにかしたい、みたいな?

その場合、このページが参考になるでしょう。
http://msdn.microsoft.com/ja-jp/library/ms228772.aspx
ここでは DTE の(時間が掛かる)メソッドを呼び出してますが。
引用返信 編集キー/
■51595 / inTopicNo.3)  Re[2]: IMessageFilterのメソッド
□投稿者/ ミキモト (2回)-(2010/07/10(Sat) 22:53:36)
No51577 (Hongliang さん) に返信
> Application.AddMessageFilter で使用する System.Windows.Forms.IMessageFilter インターフェイスにはそんなメソッドはありません。
> COM のインターフェイス IMessageFilter にはありますけど、これは単にたまたま名前が同じというだけで、System.Windows.Forms.IMessageFilter とは関係ありません。
> で、後者が欲しいのでしょうか? COM メソッドの呼び出しに時間が掛かりすぎてダイアログが出るのをどうにかしたい、みたいな?
> 
> その場合、このページが参考になるでしょう。
> http://msdn.microsoft.com/ja-jp/library/ms228772.aspx
> ここでは DTE の(時間が掛かる)メソッドを呼び出してますが。

ありがとうございます。
「System.Windows.Forms.IMessageFilter」 と「COM のインターフェイス IMessageFilter 」と混同してました。

やりたかったことは、
メインスレッドとは別のスレッドでExcel2002オブジェクトを生成してExcelファイルへ書き込み、上書き保存をしているのですが、
Excleから「メッセージフィルタはアプリケーションがビジーであることをしめしています。」の例外が発生するときがあるので、
そのときは、ビジーでなくなるまでリトライして、一通りのExcelの処理をすべて正常完了させたいのです。

で、
参考ページをみて、実行してみたのですが、
t = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0", True)
を実行するところで「クラス文字列が無効です」の例外がでてしまいます。
参照ページの通り
COM 参照を "Microsoft Development Environment 8.0" に追加し、
ソリューションに EnvDTE と EnvDTE80 に対する参照が追加されてます。

VB.Net2008はCOM参照は"Microsoft Development Environment 9.0"かとおもい、
追加してソリューションに EnvDTE90 に対する参照も追加して。

t = System.Type.GetTypeFromProgID("VisualStudio.DTE.9.0", True)

としてみましたが、やはじ同じ例外が発生しました。



以下スレッドで実行しているコードです。

    Public Sub TEST()
        Dim dte As EnvDTE80.DTE2
        Dim obj As Object = Nothing
        Dim t As System.Type = Nothing
        Dim MSGFilter As MessageFilter
        t = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0", True)
        obj = System.Activator.CreateInstance(t)
        dte = DirectCast(obj, EnvDTE80.DTE2)
        MSGFilter = New MessageFilter
        dte.MainWindow.Activate()


        'ここでExcelオブジェクト生成して書込み、オブジェクト開放する


      dte.Quit()
        MSGFilter.Dispose()

End Sub


「クラス文字列が無効です」から先に進みません。
原因がわかる方、御教授ください。

引用返信 編集キー/
■51597 / inTopicNo.4)  Re[3]: IMessageFilterのメソッド
□投稿者/ Hongliang (673回)-(2010/07/10(Sat) 23:46:35)
2010/07/11(Sun) 00:02:18 編集(投稿者)

ええと、あのサンプルの DTE 関連は、Excel を COM 参照に追加するのと同じようなもんで、COM 操作の一例に過ぎません。Excel の代わりに VisualStudio をオートメーションしているだけです。
サンプルのキモは IMessageFilter の定義、その実装である MessageFilter クラス、そして IMessageFilter を登録する CoRegisterMessageFilter 関数です。
なお、サンプルでは IMessageFilter インターフェイスに IOleMessageFilter と名付けていますが、COM のインターフェイスにおいて名前は重要ではなく、GUID によってインターフェイスを特定するので実際には同一の物です(System.Windows.Forms.IMessageFilter と混同するのを避けるために名前を変えたのでしょう、多分)。

// サンプルコード、コメントがぐちゃぐちゃで大層読みづらいので、.NET 2.0 時代の方が良いですね。
http://msdn.microsoft.com/ja-jp/library/ms228772(VS.80).aspx
引用返信 編集キー/
■51604 / inTopicNo.5)  Re[4]: IMessageFilterのメソッド
□投稿者/ ミキモト (3回)-(2010/07/11(Sun) 23:23:48)
No51597 (Hongliang さん) に返信
> 2010/07/11(Sun) 00:02:18 編集(投稿者)
>
> ええと、あのサンプルの DTE 関連は、Excel を COM 参照に追加するのと同じようなもんで、COM 操作の一例に過ぎません。Excel の代わりに VisualStudio をオートメーションしているだけです。
> サンプルのキモは IMessageFilter の定義、その実装である MessageFilter クラス、そして IMessageFilter を登録する CoRegisterMessageFilter 関数です。
> なお、サンプルでは IMessageFilter インターフェイスに IOleMessageFilter と名付けていますが、COM のインターフェイスにおいて名前は重要ではなく、GUID によってインターフェイスを特定するので実際には同一の物です(System.Windows.Forms.IMessageFilter と混同するのを避けるために名前を変えたのでしょう、多分)。
>
> // サンプルコード、コメントがぐちゃぐちゃで大層読みづらいので、.NET 2.0 時代の方が良いですね。
> http://msdn.microsoft.com/ja-jp/library/ms228772(VS.80).aspx

Hongliang さん ありがとうございました。
恥ずかしい読み違えでした。
DTE関連をExcelに一通り置き換えたら、動くようになりました。
RetryRejectedCallメソッドもコールされました。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -