我已经看到 RocketDock 重定向了 Vista 中的最小化动画,因此 Windows 最小化到停靠栏,我很好奇这是如何完成的。实际的最小化动画是重定向到停靠栏,还是像钩子(Hook)一样阻止 Windows 最小化窗口并且 RocketDock 在窗口最小化时有自定义动画?
最佳答案
我正在开发一个名为“OpenMMT”的开源多显示器任务栏项目。我最近(通过许多令人头疼的事情)发现了如何实现这一点。
以下说明假定您知道如何使用 RegisterShellHookWindow。
在将接收 shell Hook 的窗口过程中,查找 HSHELL_GETMINRECT。
现在,从现在开始我遇到了问题。根据 MSDN,传递的 lparam 成员包含指向“SHELLHOOK”对象的指针。然而,这是真的,我无法让它工作,因为该结构的“rc”成员是一个 RECT,它与 Windows 头文件中的实际 RECT 结构不同。头文件中的 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。
关于c - 用于重定向最小化动画的 Win32 C API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998833/