ウィンドウ移動中にアプリケーションからウィンドウ サイズを変更しても、元のサイズに戻ってしまう

こんにちは、Platform SDK (Windows SDK) サポートチームです。
ユーザーによるウィンドウ移動操作とアプリケーションによるウィンドウ サイズ変更が交錯した際の OS の動作についてご案内します。

 

現象

ユーザーがウィンドウを移動している最中にアプリケーションがウィンドウのサイズを設定すると、アプリケーションが設定したサイズにならず、元の大きさに戻ることがあります。

具体的には、以下のような流れになります。

  1. ユーザーがウィンドウのキャプション上で左マウス ボタンを押し、ウィンドウの移動を開始します。左マウス ボタンは押したままにします。
  2. ファイルの読み込み完了など、なんらかのイベント通知を受けて、アプリケーションがウィンドウのサイズを設定します。
  3. ユーザーがウィンドウの移動を続けます。

このとき、ユーザーがウィンドウを移動し始めたときのウィンドウ サイズに戻ってしまい、アプリケーションが設定したサイズになりません。この状態が左マウス ボタンを離すまで継続し、離したときもアプリケーションが設定したサイズにならず、ユーザーがウィンドウを移動し始めたときのウィンドウサイズに戻ります。

 

原因

ユーザーがウィンドウを移動している最中にアプリケーションがウィンドウのサイズを変更できない動作は、Windows の既定の動作です。

 

回避方法

アプリケーションは、WM_ENTERSIZEMOVE メッセージ、および WM_EXITSIZEMOVE メッセージを監視することで、ユーザーによるウィンドウ移動を検知することができます。これらのメッセージを監視してユーザーがウィンドウを移動している間のサイズ変更を保留しておき、操作が終わってからウィンドウ サイズを変更するようにしてください。

 

補足

ウィンドウを最大化中にアプリケーションがウィンドウのサイズを設定した場合、その後のユーザー操作に依存して結果が変化します。ユーザーが最大化から戻す操作をするとアプリケーションが設定したサイズに戻りますが、最大化から戻さずにそのままウィンドウを移動すると、ウィンドウサイズはアプリケーションが設定したサイズではなく、ウィンドウを最大化する前のサイズに戻ります。最大化中にウィンドウ サイズを変更する場合には、最大化から通常表示に戻してからサイズを設定するようにしてください。

なお、この動作は、ユーザーがウィンドウの移動を開始したと判断したタイミングから発生するようになるため、キャプション上で左マウス ボタンを押したままマウスを動かさなくても移動と判断し、現象が発生することがあります。

また、Windows Server 2008 では、以下の設定により動作が変化しますので、ご注意ください。

  1. コントロール パネルの [システム] にある [システムの詳細設定] をクリックします。
  2. [システムのプロパティ] ダイアログの [詳細設定] を選び、[パフォーマンス] 内の [設定] をクリックします。
  3. [パフォーマンス オプション] ダイアログの [視覚効果] タブにある、[ドラッグ中にウィンドウの内容を表示する] のチェックをオン、もしくはオフに切り替え、[OK] または [適用] をクリックします。

オンの場合:
ウィンドウを移動すると、アプリケーションが設定する前のサイズに戻ります。
この動作は、ほかの OS と同一です。

オフの場合:
ウィンドウを移動中に表示されるドラッグ中を示すウィンドウ枠のサイズは変化しません。また、移動先が確定した際にアプリケーションが設定したサイズのまま指定位置に移動します。その結果、移動後のウィンドウ サイズは、アプリケーションが設定したサイズになり、アプリケーションが設定する前のサイズに戻ることはありません。

 

関連資料

WM_ENTERSIZEMOVE message
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632622.aspx

WM_EXITSIZEMOVE message
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632623.aspx