■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) な行があるかどうか探してみてください。
|
|