- 581 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 14:43:40 ]
- >>580 アドバイスありがとうございます。やってみましたが、
if(HIWORD(lParam) == 1){ ... } というテストはうまくいくものの、wParam にはシステムメニューのハンドルが入っていないようです。 ですので、EnableMenuItem() などに渡すメニューハンドルはやはり GetSystemMenu() を使って自前で取得しなければ ならないようです。 また、WM_INITMENUPOPUP を受け取ったときに EnableMenuItem() を呼ぶと、タイトルバーから初めてシステムメニュー を呼び出したとき、システムメニューの表示位置が若干上にずれて、タイトルバーを覆い隠すような形で出てくるようです。 まあ2回目以降は正常に戻るので、気にするほどのことではないかもしれないですが…。 あと、WM_INITMENU の場合は対象がシステムメニューかどうか見分けが付かないので、自分で初回スイッチのような ものを用意して対処する必要がありそうですね。 それと、さっき色々試していて気が付いたのですが、WM_INITMENU または WM_INITMENUPOPUP を受け取ったときに EnableMenuItem() する方法だと、タスクバーを初めて右クリックしたときに項目が無効にならないようです。 2回目以降、もしくは初回であっても事前にタイトルバーからシステムメニューを表示させていれば EnableMenuItem() の設定が反映されるんですが…。 調べてみたところ、タスクバーが右クリックされたときには非公開メッセージ 0x313 が送られてくるとの情報があったので、 (参考: www.hey-to.net/ML-archive/vcppML/1999/msg03694.html) 0x313 を捕捉し、そのハンドラで EnableMenuItem() などの設定を行い、 さらに DefWindowProc() にメッセージを処理させればよい…みたいです。 >>576の環境でしかテストしていないのであまり自信がないですが、これだと一応タスクバー初回右クリック時も正しく 項目が無効化されたシステムメニューが表示されます。 とはいえ、非公開メッセージに依存するのも微妙な感じなので、いっそ WM_CREATE のハンドラで無効にしたい項目を DeleteMenu() してしまうのが一番簡単かもしれないですね。 長文失礼しました。Windows って難しいです。
|

|