小智 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
该结构ptMinPosition的成员WINDOWPLACEMENT指定窗口最小化时的坐标,因此SetWindowPlacement可以使用函数来达到该效果。但一些测试表明窗口不应该有任务栏按钮才能工作(即没有WS_EX_APPWINDOW)。
我不知道 RocketDock 是如何工作的,但我想这可以通过安装全局WH_CBT钩子并根据通知采取行动(设置 ex_style 然后设置最小化坐标)来实现HCBT_MINMAX。
| 归档时间: |
|
| 查看次数: |
2039 次 |
| 最近记录: |