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

Ani*_*Dev 6 c winapi redirect minimize

我已经看到RocketDock重定向Vista中的最小化动画,因此Windows最小化到了停靠站,我只是很好奇这是如何完成的.实际的最小化动画是重定向到停靠点,还是像挂钩一样阻止Windows最小化窗口,而RocketDock在窗口最小化时有自定义动画?

小智 6

我正在开发一个名为"OpenMMT"的开源多监视器任务栏项目.我最近发现(通过许多头痛)如何实现这一目标.

以下说明假定您知道如何使用RegisterShellHookWindow.

在将接收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;
Run Code Online (Sandbox Code Playgroud)

然后在窗口过程:

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;
}
Run Code Online (Sandbox Code Playgroud)

当我的应用程序中的程序最小化时,我遇到了一些动画将默认恢复为原始动画的实例.我通过最小化它们来解决这个问题:

void MinimizeApp(HWND hWnd) {
  SetForegroundWindow(hWnd);
  ShowWindowAsync(hWnd, SW_MINIMIZE);
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关我的项目的更多信息,或者您只想查看来源,请随时访问https://github.com/Fafson/OpenMMT


Ser*_*yuz 4

该结构ptMinPosition的成员WINDOWPLACEMENT指定窗口最小化时的坐标,因此SetWindowPlacement可以使用函数来达到该效果。但一些测试表明窗口不应该有任务栏按钮才能工作(即没有WS_EX_APPWINDOW)。

我不知道 RocketDock 是如何工作的,但我想这可以通过安装全局WH_CBT钩子并根据通知采取行动(设置 ex_style 然后设置最小化坐标)来实现HCBT_MINMAX