用于重定向最小化动画的Win32 C API

用于重定向最小化动画的Win32 C API,c,winapi,redirect,minimize,C,Winapi,Redirect,Minimize,我见过RocketDock在Vista中重定向最小化动画,使windows最小化到dock,我只是好奇这是如何做到的。实际的最小化动画是否重定向到dock,或者类似于一个钩子来阻止窗口最小化窗口,而RocketDock在窗口最小化时有一个自定义动画?您可以使用animatewindowAPI函数,并将其传递,例如AW_HOR_POSITIVE | AW_VER_POSITIVE,以获得对角线动画 我将从一个全局钩子开始捕获WM_SYSCOMMAND/SC_MINIMIZE,并使用AnimateW

我见过RocketDock在Vista中重定向最小化动画,使windows最小化到dock,我只是好奇这是如何做到的。实际的最小化动画是否重定向到dock,或者类似于一个钩子来阻止窗口最小化窗口,而RocketDock在窗口最小化时有一个自定义动画?

您可以使用animatewindowAPI函数,并将其传递,例如AW_HOR_POSITIVE | AW_VER_POSITIVE,以获得对角线动画

我将从一个全局钩子开始捕获WM_SYSCOMMAND/SC_MINIMIZE,并使用AnimateWindow以右上角为目标


如果这不能提供所需的效果,下一步将是使用WM_PRINT/WM_PRINTCLIENT将窗口的副本复制到位图中(我相信这是AnimateWindow内部所做的),然后隐藏窗口并制作自己的动画

结构的
ptMinPosition
成员指定窗口最小化时的坐标,因此可以使用该函数来实现该效果。但是一些测试显示,窗口不应该有任务栏按钮来工作(即否)


我不知道RocketDock是如何工作的,但我想这可以通过安装一个全局钩子来实现,并根据(设置ex_样式,然后设置最小化坐标)
HCBT_MINMAX
通知。

我正在开发一个名为“OpenMMT”的开源多监视器任务栏项目。我最近发现(经历了许多麻烦)如何做到这一点

下面的解释假设您知道如何使用RegisterShareHookWindow

在将接收shell钩子的窗口过程上,查找HSHELL_GETMINRECT

现在,从这里开始,我遇到了一些问题。根据MSDN,传递的lparam成员包含一个指向“SHELLHOOK”对象的指针。这是真的,但是,我无法让它工作,因为“rc”该结构的成员,是一个与Windows头文件中实际的RECT结构不同的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);
}

如果你想了解更多关于我的项目的信息,或者你只是想看一下源代码,请随时访问

,但是RocketDock如何使用该功能来为dock最小化设置动画?即使你没有WS_EX_APPWINDOW,你也可以使用任务栏按钮,请参见,谢谢,这正是我想要的答案。好的,谢谢你的帮助-我会的好的。我只是出于好奇才问的。我一定会调查你的项目。