7

作業中のアプリケーション (Windows デスクトップ、ネイティブ C++ アプリケーション) で Aero Snap が機能しないという問題があり、何が起こっているのか少し混乱しています。箱。

最小限の win32 アプリケーションで Spy++ を使用しましたが、Win-Left を押すと次のメッセージが表示されます。

<00070> 00030D1C P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:0 fUp:0 <00071> 00030D1C P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0 <00072> 00030KeyD1C P WM_KEYDOWN nVirt VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0 <00088> 00030D1C S WM_GETMINMAXINFO lpmmi:0043FCBC
<00089> 00030D1C R WM_GETMINMAXINFO lpmmi:0043FCBC
<00090> 00030D1C S WM_WINDOWPOSCHANGING lpwp:0043FCC4
<00091> 00030D1C S WM_GETMINMAXINFO lpmmi:0043F8E8
< 00092> 00030D1C R WM_GETMINMAXINFO lmmi:0043F8E8
<00093> 00030D1C R WM_WINDOWPOSCHANGING
.. など

そのため、左キーの WM_KEYDOWN がアプリケーションに到達していないことがわかりますが、代わりにエアロ スナップの「ウィンドウのサイズ変更」が取得されています。

アプリケーションを Spy++ すると、左のキーが「傍受」されていないことがわかりますが、代わりにアプリケーションに渡されているため、スナップの良さは得られません。

<00043> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:0 fUp:0
<00044> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0
<00045> 000FKey0F12 P WM_KEYDOWN nVirt VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0
<00060> 000F0F12 P WM_KEYUP nVirtKey:VK_LEFT cRepeat:1 ScanCode:4B fRepeat:0 fUp:1

メッセージ処理のコアを掘り下げて何が起こっているかを確認しますが、得られるすべてのヒントを取り上げます:)

編集Win-Up と Win-Shift-Left/Right が実際には正しく機能することに気付きました。そのため、正しい位置/サイズに「エアロ スナップ」されていないのは Win-Down と Win-Left/Right だけです。

編集OK、問題は、ウィンドウが WS_THICKFRAME フラグで作成されていないことです。フラグを追加すると、スナップが機能します。今、私は実際に境界線を最初から望んでいませんが、少なくとも何が奇妙な動作を引き起こしているのかを知っています..

願わくば最後の編集境界線を取り除くことは、WM_NCCALCSIZE に応答して、クライアントがウィンドウ全体を占めるようにするのと同じくらい簡単でした。

4

2 に答える 2

5

特定のメッセージを思い出せませんが、メイン ウィンドウの WM_MOVING/WM_MOVE および/または WM_SIZING/WM_SIZE メッセージを処理すると、Aero Snap は無効になります。これらが到達しない場合、DefWindowProcAero Snap は機能しません。DefWindowProc が Aero Snap の実装を担当していると思うので、それらのメッセージが確実に到達するようにすると、役立つかもしれません。

カスタム ウィンドウ ドラッグ コードを実装していることを発見したため、ウィンドウがドラッグされている間、アプリケーションは引き続き実行され、画面が更新されます。これは、これらのメッセージを処理することを意味しましたが、Aero Snap を無効にしました。

編集:さらに調べてみると、私が言及したアプリケーションは WM_SYSCOMMAND を処理(wParam & 0xFFF0) == SC_MOVEし、ウィンドウ移動の開始を示すためにチェックします。次に、0 を返し、ウィンドウの位置を定期的に更新することでウィンドウのドラッグをシミュレートします。これにより、Windows はウィンドウを移動できず、ユーザーはドラッグできないと判断しますが、アプリケーションは位置を更新して作成します。 WM_LBUTTONUP まで、まだドラッグされているように見えます。ウィンドウがドラッグされていると判断されない場合、明らかに Windows は Aero Snap を試しません。たぶん、あなたのアプリケーションは似たようなことをします (誰かがドラッグ中にアプリを実行し続けるためのより良い方法を持っているなら、私は聞いてみたいです)。

于 2010-05-27T12:21:24.423 に答える
2

メッセージ処理ではないかと思います。メッセージ ループは WM_KEYDOWN メッセージを決して見ません。さまざまなことを試して失敗した後、Windows があなたのアプリに何らかの形で互換性がないと考えていることしか推測できません。たとえば、プログラムで SetWindowsHookEx() を使用します。

于 2010-05-27T12:26:38.343 に答える