- PR -

Windowハンドルについて

1
投稿者投稿内容
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 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/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-06-11 18:02
引用:

(3)
この状態でWindowハンドルを退避(this.Handle)



どの状態でしょう?
Form.Load() 以前だと、ウィンドウハンドルは無効な気がしますが。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 2004-06-11 21:19
>渋木宏明(ひどり)さん

いつもお世話になっております。

Formのコンストラクタの中です。
"InitializeComponent()"が走った後に
退避しています。

よろしくお願いします。




Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2004-06-11 21:35
Hasumiです。

引用:
Formのコンストラクタの中です。


だとForm.Load() 以前なので、Load時にWindowハンドルを退避させればいいのでは
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 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のプロパティを変更すると
ハンドルが変わる)


ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-06-12 12:48
確かIWin32Window.Handleは変更されないことを保障してなかった(しなくてもよい)はずと思ったので、ヘルプを見たら、

引用:

IWin32Window.Handle
解説
実装によっては、ウィンドウの有効期間中に Handle プロパティの値が変わる場合があります。



ちゃんと書いてありますよ。
むしろそのためのHandleCreated, HandleDestroyedイベントだと思ってたんですが…。これらのイベントできちんと状態を更新させてもだめですか?
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 2004-06-12 13:20
>yaさん

ご回答ありがとうございます。

出来れば状態の更新を避けたかったのですが
それが.NETの振る舞いであれば仕方ないので
別の方法を考えます。

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

スキルアップ/キャリアアップ(JOB@IT)