8

エアロスナップ機能を使用してウィンドウのサイズが変更されたかどうかを確認するにはどうすればよいですか?GetWindowPlacement関数は、最新の「復元された」ウィンドウサイズを提供します。私はそれを次のように使用します:

WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );

たとえば、wp.rcNormalPosition = {top=208 bottom=520 left=152 right=510}あるべきときに、 を与えます{top=0 bottom=1920 left=152 right=510}

GetWindowRectまったく同じ誤った結果が得られることに注意してください。それは私のせいでしたGetWindowRect、正しい結果を与えます。

プログラムの終了時にウィンドウの状態を保存し、開始時にロードする必要があるため、ウィンドウがどのように配置されているかを知る必要があります。実際のウィンドウ座標を確認するにはどうすればよいですか?


さて、私は(そして他のいくつかの標準的なWindowsコンポーネント)でいくつかのテストを行いました、notepad.exeそしてそれは同じ方法でその状態を保存します—それが「スナップ」されたかどうかを覚えていません。したがって、これはWindowsプログラムの意図された動作であると思います。

4

1 に答える 1

7

AeroSnapは、ウィンドウマネージャーによってアプリに送信される別の種類のサイズ変更です。そのため、他のタイプのサイズ変更ではなく、スナップであることがわかりません。

期待できる最善の方法は、サイズイベントの過程で反対側のエッジが移動したことを検出することです。移動イベントと区別するために、高さまたは幅がに変更されたことを確認する必要があります。

これが簡単だと言われない理由は、アプリがサイズ変更のメカニズムを気にする理由を想像するのが難しいためです。


コメントはあなたの問題についてもっと明らかにしました。アプリを閉じたときにアプリの位置とサイズを維持して、再起動したときにアプリを復元できるようにしようとしています。あなたはGetWindowPlacement()そうするために使用していて、ウィンドウの最後のサイジングがエアロスナップだったときにそれが間違った位置を返すことを発見しました。

私自身のアプリもまったく同じように動作し、まったく同じ問題が発生しました。私が使用した解決策は、ウィンドウの位置とサイズを取得するGetWindowRect()代わりに呼び出すことでした。GetWindowPlacement()あなたはこれがあなたのために失敗すると述べます、その場合私は何を提案するべきか分かりません。GetWindowRect()私はそれが正しいウィンドウの長方形を返さないことを信じるのは少し難しいと思うと言わなければなりません。

于 2011-04-15T07:07:52.570 に答える