- - PR -
Windowハンドルについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-06-11 15:48
[WinXP(SP1)、.NET2003 C#、Windowsアプリケーション]
いつもお世話になっております。 Windowハンドルについて質問があります。 (1) フォームを1つ持つWindowsアプリケーションを作成 (2) 起動時、タスクトレイにアイコンとメニューを登録 (WindowState=Minimized、ShowInTaskbar=false) (3) この状態でWindowハンドルを退避(this.Handle) (4) タスクトレイのメニューを選択し、タスクバーにFormを表示させる (ShowInTaskbar=true) (4)の後、再度Windowハンドルを調べたところ、 起動時と変わってしまうのですが、何故でしょうか? 起動時(3の時)に取得したWindowハンドルはあるDLLに渡し、 そのハンドルに対してDLL側の状態が変わったら Postメッセージで通知してもらう為(WndProcをoverride)に 使用しています。ただ途中で変わってしまうため (画面を表示させると)メッセージを受けることが できなくなります。 VCで作成していた時も同じようにタスクトレイに アイコンを登録し画面の表示、非表示等を行って いましたが問題なく出来ていたため、そのままを .NETで置き換えました。 (3)の時に起動時のWindowハンドルを変えないよう な方法があるのでしょうか? ご教授よろしくお願い致します。 | ||||
|
投稿日時: 2004-06-11 18:02
どの状態でしょう? Form.Load() 以前だと、ウィンドウハンドルは無効な気がしますが。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||
|
投稿日時: 2004-06-11 21:19
>渋木宏明(ひどり)さん
いつもお世話になっております。 Formのコンストラクタの中です。 "InitializeComponent()"が走った後に 退避しています。 よろしくお願いします。 | ||||
|
投稿日時: 2004-06-11 21:35
Hasumiです。
だとForm.Load() 以前なので、Load時にWindowハンドルを退避させればいいのでは | ||||
|
投稿日時: 2004-06-12 11:58
>Hasumiさん
ご回答ありがとうございます。 Form.Load()以降退避しても結果は 同じです。 現象としましては [起動時] ;Formのプロパティ ShowInTaskbar=false WindowState=Minimized [タスクトレイのメニューから表示を選択] ;Formのプロパティ ShowInTaskbar=true [タスクトレイのメニューから非表示を選択] ShowInTaskbar=false WindowState=Minimized この3つでWindowハンドルを比較すると 変わっています。非表示・表示を 繰り返して行うとその度に変わります。 起動時のWindowハンドルの退避をコンストラクタ で行っても、Form.Loadで行っても、 メニュー選択の、表示・非表示を変更しなければ WndProcでのメッセージ受信は可能です。 (ハンドル退避後にFormのプロパティを変更すると ハンドルが変わる) | ||||
|
投稿日時: 2004-06-12 12:48
確かIWin32Window.Handleは変更されないことを保障してなかった(しなくてもよい)はずと思ったので、ヘルプを見たら、
ちゃんと書いてありますよ。 むしろそのためのHandleCreated, HandleDestroyedイベントだと思ってたんですが…。これらのイベントできちんと状態を更新させてもだめですか? | ||||
|
投稿日時: 2004-06-12 13:20
>yaさん
ご回答ありがとうございます。 出来れば状態の更新を避けたかったのですが それが.NETの振る舞いであれば仕方ないので 別の方法を考えます。 ありがとうございました。 |
1