Я работаю над проектом панели задач с несколькими исходными кодами с открытым исходным кодом под названием «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