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

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

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

メッセージボックスの位置を設定する

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

■97986 / inTopicNo.1)  メッセージボックスの位置を設定する
  
□投稿者/ サーファー (1回)-(2021/08/18(Wed) 12:29:35)

分類:[.NET 全般] 

VB.NETを使用しております。

メッセージボックスの位置をウインドウの中央にしたいと考えています。

' https://qiita.com/Apeworks/items/263645a599f3ed73567e
' https://www.ipentec.com/document/csharp-show-message-box-in-center-of-owner-window

この辺りのコードを参考にして、
うまくウインドウ中心に表示させることはできました。


しかし、毎回ではなく、まれにですが、

CallbackOnCollectedDelegate が発生しました。
Message: マネージ デバッグ アシスタント 'CallbackOnCollectedDelegate' が 'D:\xxx.exe' で問題を検出しました。
追加情報:コールバックが、型 'xxx.MsgBoxSetPosition+Win32Native+HOOKPROC::Invoke' のガベージ コレクションされたデリゲートで行われました。これは、アプリケーションのクラッシュ、破損、およびデータの損失を発生させる可能性があります。デリゲートをアンマネージ コードに渡すとき、デリゲートは 2 度と呼び出されないことが確実になるまでマネージ アプリケーションによって維持されなければなりません。



というエラーが発生し、プログラムがクラッシュしてしまいます。


大体、プログラム起動後の一回目のメッセージボックスの表示でエラーが出ます。



http://answersweb.azurewebsites.net/MVC/Post/Thread/0c25dc53-b137-4146-88cf-61869670a128?category=csharpgeneralja

このページなどによると
GCによりProcが破棄されてしまうことが原因、というようなことが書かれてあります。


どのようにすれば、エラーが出ないようにできますか?







引用返信 編集キー/
■97987 / inTopicNo.2)  Re[1]: メッセージボックスの位置を設定する
□投稿者/ サーファー (2回)-(2021/08/18(Wed) 12:42:14)
恐らく、
SetHookした後に
Messageboxを表示するまでの間に
GC処理が入ってしまった場合にエラーになっているのではないかと推測します。

一時的にGC処理が起きないよう停止させることはできますでしょうか?

引用返信 編集キー/
■97988 / inTopicNo.3)  Re[1]: メッセージボックスの位置を設定する
□投稿者/ Hongliang (1190回)-(2021/08/18(Wed) 12:51:11)
SetWindowsHookExに渡すデリゲートインスタンスをフィールドに保持しておく必要があるかと思います。

Class Form1
    Private _Proc As HOOKPROC
    Sub Show(...)
        Me._Proc = AddressOf HookProc ' こんなんでよかったっけ…New HOOKPROC(Address Of...)だったっけ…
        Me._HHook = SetWindowsHookEx(WH_CBT, Me._Proc, ...)

引用返信 編集キー/
■97989 / inTopicNo.4)  Re[2]: メッセージボックスの位置を設定する
□投稿者/ サーファー (3回)-(2021/08/18(Wed) 13:40:57)
ありがとうございます。

解決しました。


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

このトピックをツリーで一括表示


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

このトピックに書きこむ