最大化和 Aero Snap 在可停靠浮动窗口上的应用

26

我有以下代码可以让一个未停靠的AvalonDock浮动窗口具备最大化功能:

class MaximizableDockableContent : AvalonDock.DockableContent
{
    public MaximizableDockableContent()
        : base()
    {
         base.StateChanged += MaximizableDockableContent_StateChanged;
    }

    private void MaximizableDockableContent_StateChanged(
        object sender, RoutedEventArgs e)
    {
        MaximizableDockableContent mdc = (MaximizableDockableContent)sender;
        if (mdc.State == DockableContentState.DockableWindow)
        {
            base.FloatingWindowSizeToContent = SizeToContent.WidthAndHeight;
            FloatingDockablePane fdp = (FloatingDockablePane)base.Parent;
            DockableFloatingWindow dfw = (DockableFloatingWindow)fdp.Parent;

            //dfw.WindowState = WindowState.Maximized;
            dfw.WindowStyle = WindowStyle.ThreeDBorderWindow;
            dfw.ResizeMode = ResizeMode.CanResize;

            //disable minimize button
            ControlBox.SetHasMinimizeButton(dfw, false);
        }
    }
}

我该如何为这个添加Aero Snap功能呢?


1
重要的类似乎是“WindowInteropWrapper.cs”。我希望有人能指出Aero Snap的重要代码行。 - Andreas
非常感谢您的帮助。我只想在Windows 7中使用Aero Snap。但不幸的是,Win7无法将我的浮动Avalondock内容识别为普通的操作系统窗口,因此无法将其捕捉。如果您能告诉我需要编辑代码的哪个部分,那就太好了。 如果您在FloatingWindow.cs中注释掉第483行(svn版本1.3)“wih.FilterMessage += new EventHandler<FilterMessageEventArgs>(FilterMessage);”,则可使可停靠内容进行Aero Snap,但不幸的是,它将不再停靠到管理器中。 - Andreas
似乎 WindowInteropHelper 类使得窗口消息被 HookHandler 独占处理,因此窗口消息无法触发 AeroSnap 事件。 - Andreas
在FloatingWindow.cs文件中的508、510、511行,如果有WM_SIZE、WM_MOVE消息,似乎会退出switch。您可能想要记录这些或检查其中发生了什么。 - Jake Berger
谢谢你的快速回复。我会看一下这个的。 - Andreas
显示剩余4条评论
3个回答

1

anon说:“不幸的是,这也禁用了Windows + 上下箭头来最大化/最小化活动窗口。”

vIBIUS说:“这也禁用了Windows键+Shift和左/右选项!”

Kermonk说:“不幸的是,这也禁用了“摇晃窗口以关闭所有其他窗口”的功能……”

试试这个:

[HKEY_CURRENT_USER\Control Panel\Desktop]
"DockMoving"="0"

它禁用了鼠标操作以最大化窗口和将窗口捕捉到侧面,但不影响键盘快捷键。它不会影响AeroPeak或AeroShake。它也不会影响“仅在垂直方向上最大化窗口”。


1

1

你可以使用Runtime运行外部进程:

http://www.nirsoft.net/utils/nircmd.html下载nircmd.exe,并确保它与.class文件在同一目录下或在Windows PATH环境变量中

然后使用Runtime.exec()多次运行它:

Runtime r=Runtime.getRuntime();
r.exec("nircmd.exe sendkey lwin down");
r.exec("nircmd.exe sendkey "+direction+" press");
//change direction to "right" (for right side), "left" (for left side), or "up" (for full window).
r.exec("nircmd.exe sendkey lwin up");

请注意,这可能会抛出IOException异常,因此可能需要使用try/catch块。

请注意:这假定窗口是活动窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接