Аэро Снимок, не работающий на мое приложение

У меня есть проблема с Аэро Снимком, не работающим с приложением, я продолжаю работать (рабочий стол Windows, собственное приложение C++), и я немного смущен относительно того, что происходит, поскольку кажется, что это должно просто работать из поля.

Я использовал Шпиона ++ на приложении mininal win32 и получаю следующие сообщения, когда я нажимаю 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 cR epeat:1 ScanCode:5B fRepeat:1 fUp:0 <00072> 00030D1C P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0 <0008 8> 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 lpmmi:0043F8E8
<00093> 00030D1C R WM_WINDOWPOSCHANGING
.. и так далее

Таким образом, я вижу, что WM_KEYDOWN для левого ключа не достигает приложения, но я добираюсь, аэро снимок "изменяют размер окна" материал вместо этого.

Когда я Шпионю ++ мое приложение, я вижу, что левый ключ "не прерывается", но вместо этого переданной приложению, таким образом, я не получаю совершенства привязки.

<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> 000F0F12 P WM_KEYDOWN nVirtKey: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-Shift-Left/Right на самом деле работают правильно, таким образом, это - просто Win-Down и Win-Left/Right, которые не являются "аэро сфотографированный" в правильное положение / размер.

Редактирование хорошо, проблема, кажется, что мое окно не было создано с флагом WS_THICKFRAME. Если я добавляю флаг, привязываю работы. Теперь, я на самом деле не хочу границу там во-первых, но по крайней мере я знаю то, что вызывало странное поведение..

Надо надеяться, заключительное редактирование, Избавляющееся от границы, было так же просто как отвечающий на WM_NCCALCSIZE и заставляющий клиент занять целое окно.

7
задан Rob 13 October 2010 в 13:34
поделиться

2 ответа

Я не могу вспомнить конкретную сообщения, но Aero Snap отключается, если вы обрабатываете сообщения WM_MOVING / WM_MOVE и / или WM_SIZING / WM_SIZE для главного окна. Если они не достигнут DefWindowProc Aero Snap не будет работать. Я предполагаю, что DefWindowProc отвечает за реализацию Aero Snap, поэтому, если вы убедитесь, что эти сообщения доходят до него, это может помочь.

Я обнаружил, что эта реализация кода перетаскивания настраиваемого окна позволяет приложению продолжать выполнение и обновлять экран во время перетаскивания окна, что означало обработку этих сообщений, но отключило Aero Snap.

Правка: При дальнейшем рассмотрении упомянутое мной приложение обрабатывает WM_SYSCOMMAND и проверяет (wParam & 0xFFF0) == SC_MOVE , чтобы указать начало перемещения окна. Затем он возвращает 0 и имитирует перетаскивание окна, периодически обновляя положение окна, пока еще выполняется приложение, рисование и т. Д. Это заставляет Windows думать, что окно неподвижно и что пользователь не может его перетащить, но мое приложение обновляет положение, чтобы сделать похоже, что его все еще тащат, до WM_LBUTTONUP. Очевидно, Windows не будет пытаться использовать Aero Snap, если не думает, что окно перетаскивается. Может быть, ваше приложение делает что-то подобное (если у кого-то есть лучший способ поддерживать работу приложения во время перетаскивания, мне было бы интересно услышать).

4
ответ дан 7 December 2019 в 09:57
поделиться

Я сомневаюсь, что это обработка сообщений, цикл сообщений никогда не видит сообщение WM_KEYDOWN. Попробовав разные вещи безуспешно, я могу только догадываться, что Windows думает, что ваше приложение каким-то образом несовместимо. Например, используя SetWindowsHookEx () в вашей программе.

2
ответ дан 7 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: