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

わんくま同盟

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

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


(過去ログ 136 を表示中)
■79917 / )  Re[3]: カラーパレット任意の座標に表示する
□投稿者/ 魔界の仮面弁士 (732回)-(2016/05/27(Fri) 20:28:05)
No79910 (kazu さん) に返信
> メソッド内でnewしてない場合はdisposeしない方がいいと言うのをしりませんでした。

メソッド内で new したかどうか、と言う話ではなく、
 「Dispose したオブジェクトは再利用してはいけない」
ということです。破棄したオブジェクトにアクセスした場合、
ObjectDisposedException などの例外になりえます。


ColorDialog は、Dispsose を処理していないクラスであるため、
今回は呼ぼうが呼ぶまいが影響しませんでしたが、もしも相手が
Form だった場合、Dispose 後のアクセスは御法度です。

var fm = new Form2();
fm.ShowDialog();
fm.Dispose();
fm.ShowDialog(); // 例外


>> ref ではなく out 引数の方が良いと思います。間違いではありませんけれどね。
> outで書いた場合の書き方も教授していただけると幸いです
動作に影響する部分ではないので、変えなくても問題は無いですが、変更するなら
  [DllImport("user32.dll", CharSet = CharSet.Auto)]
  private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
などとします。この場合の RECT は class ではなく struct です。
呼び出し側も、ref → out に変更することになります。


>>> if (msg == 0x110) 部分でmsg == 0x110がfalseになるため中の処理に入らず、
>>その場合の msg は何でしたか?
> この部分のメソッドが呼ばれるたびにmsgの値は変わっているので、これと言ってひとつではなかったです。
> 3桁から4桁の数字が入っていました。

2 桁もありますよね。

HookProc の処理の冒頭に、if (msg == 0x110) を置いていると思いますが、
その if の直前に、下記のようなコードを一時的に加えてみてください。

 var m = Message.Create(hWnd, msg, wparam, lparam);
 System.Diagnostics.Debug.WriteLine(m.ToString());

その上でアプリを起動し、出力ウィンドウを確認してみてください。

出力ウィンドウが見当たらない場合は、メニューの
[デバッグ]-[ウィンドウ]-[出力]で表示できます。


そうすると恐らくは、
 msg=0x30 (WM_SETFONT) hwnd=…
 msg=0x55 (WM_NOTIFYFORMAT) hwnd=…
   :
のような記述が延々と表示されると思いますので、その中に、
msg=0x110 (WM_INITDIALOG) な行があるかどうか探してみてください。
返信 編集キー/


管理者用

- Child Tree -