私のアプリケーションは、独自のウィンドウ枠と装飾をすべて描画します。アプリケーションウィンドウが最大化されている場合を除いて、自動非表示に設定されている Windows タスクバーで問題なく動作します。タスクバーは「ロールアップ」しません。アプリケーションを最大化していなくても、画面の一番下までサイズを大きくしても、正常に動作します。ウィンドウのサイズを変更してディスプレイ全体を占めるようにしても(最大化されているかのように)、正常に機能します。
2 に答える
問題が見つかりました。私のアプリケーションは WM_GETMINMAXINFO メッセージを処理していて、パラメータ MINMAXINFO レコードの値をオーバーライドしていました。レコードに含まれていた値は、画面のピクセル解像度の 7 (境界線の幅) だけ膨張していました。これは、最大化すると、ウィンドウの境界が画面の可視部分を超えて押し出されるという点で理にかなっています。また、ptMaxPosition (最大化されたときにウィンドウの原点が設定されるポイント) を -7、-7 に設定します。私のアプリケーションはそれを 0,0 に設定し、最大の高さと幅を正確に画面解像度のサイズ (膨張していない) に設定していました。なぜこれが行われたのかわかりません。先人が書いたものです。そのコードをコメントアウトし、MINMAXINFO 構造体を変更しないと、自動非表示が機能します。
理由については、私にはよくわかりません。「自動非表示」タスクバーのポップアップの検出が、WM_NCMOUSEMOVE ではなく、WM_MOUSEMOVE メッセージを処理するメカニズムにフックされている可能性があります。アプリケーションが最大化を行って境界線を画面の一番下に配置すると、WM_NCMOUSEMOVE イベントが生成されます。MINMAXINFO をそのままにしておくと、WM_MOUSEMOVE を生成していたでしょう。
これは、タスクバーのプロパティで[タスクバーを他のウィンドウの上に置く]がオンになっているかどうかによって異なります。チェックすると、タスクバーが表示されます。
ただし、エンドユーザーのマシンでこの設定をプログラムで変更して、ニーズに合わせようとしないでください。これは失礼で悪い習慣と見なされます。アプリは、デプロイ先の環境に適合している必要があります。