Win32 C API для перенаправления минимизации анимации - PullRequest
6 голосов
/ 15 февраля 2011

Я видел, как RocketDock перенаправлял анимацию минимизации в Vista, чтобы окна свернулись в док, и мне просто любопытно, как это было сделано. Фактическая анимация минимизации перенаправлена ​​на док-станцию, или это что-то вроде зацепки, которая не дает Windows свернуть окно, и RocketDock имеет собственную анимацию, когда окно свернуто?

Ответы [ 3 ]

6 голосов
/ 28 августа 2011

Я работаю над проектом панели задач с несколькими исходными кодами с открытым исходным кодом под названием «OpenMMT». Я недавно обнаружил (через множество головных болей), как этого добиться.

В следующем объяснении предполагается, что вы знаете, как использовать RegisterShellHookWindow.

В оконной процедуре, которая получит перехватчики оболочки, ищите HSHELL_GETMINRECT.

С этого момента у меня возникли проблемы. Согласно MSDN, переданный член lparam содержит указатель на объект SHELLHOOK. Что верно, однако, я не мог заставить его работать из-за того простого факта, что «rc» член этой структуры, является RECT, который отличается от фактической структуры RECT в заголовочных файлах Windows. RECT в заголовочных файлах использует LONG для своих членов, как здесь, мы хотим SHORT.

В любом случае, вот фрагмент того, как я это сделал.

Структуры для определения:

typedef struct {
  SHORT left;
  SHORT top;
  SHORT right;
  SHORT bottom;
} REALRECT, *LPREALRECT;

typedef struct {
  HWND hWnd; 
  REALRECT rc;
} DOCUMENT_ME_RIGHT_MICROSOFT, *LPDOCUMENT_ME_RIGHT_MICROSOFT;

Затем в окне Процедура:

case HSHELL_GETMINRECT:
{
  LPDOCUMENT_ME_RIGHT_MICROSOFT lpShellHook = (LPDOCUMENT_ME_RIGHT_MICROSOFT)lParam;
  // lpShellHook now contains all the info. If you want to change the location
  // of the animation, simply change the lpShellHook->rc members to point
  // to the right coordinates and then return TRUE;
  return TRUE;
}

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

void MinimizeApp(HWND hWnd) {
  SetForegroundWindow(hWnd);
  ShowWindowAsync(hWnd, SW_MINIMIZE);
}

Если вам нужна дополнительная информация о моем проекте или вы просто хотите взглянуть на источник, не стесняйтесь сделать это на https://github.com/Fafson/OpenMMT

4 голосов
/ 15 февраля 2011

Элемент ptMinPosition структуры WINDOWPLACEMENT определяет координаты окна, когда оно свернуто, поэтому для этого можно использовать функцию SetWindowPlacement. Но некоторые тесты показывают, что в окне не должно быть кнопки панели задач, чтобы это работало (т.е. нет WS_EX_APPWINDOW).

Я не знаю, как работает RocketDock, но, полагаю, этого можно добиться, установив глобальный хук WH_CBT и действуя (установив ex_style и затем установив минимизированные координаты) HCBT_MINMAX извещение.

1 голос
/ 15 февраля 2011

Вы можете использовать функцию API AnimateWindow и передать ее, например, AW_HOR_POSITIVE |AW_VER_POSITIVE, чтобы получить диагональную анимацию.

Я бы начал с глобальной ловушки, перехватывающей WM_SYSCOMMAND / SC_MINIMIZE, и использовал бы AnimateWindow для нацеливания на верхний правый угол.

Если это не обеспечивает желаемого эффекта, следующим шагом будет использование WM_PRINT / WM_PRINTCLIENT для получения копии окна в растровое изображение (я полагаю, это то, что делает AnimateWindow внутри), а затем скрытиеокно и делаю свою собственную анимацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...