【问题标题】:Win32 App (Aero): Prevent dialog moveWin32 App (Aero):防止对话框移动
【发布时间】:2013-04-23 12:50:56
【问题描述】:

我在 Win7-Aero 上有一个基于对话框的 Win32-app,它只显示一个对话框。对话框应该有一个标题栏。我不希望用户可以在屏幕上移动对话框。

到目前为止我没有运气...处理WM_NCHITTESTWM_SYSCOMMAND...设置SWP_NOMOVE

实现NoMove 的最佳方法是什么?我认为 DWM 在 Win7 上有所改变。

【问题讨论】:

    标签: winapi user-interface win32gui


    【解决方案1】:

    您可以通过处理WM_WINDOWPOSCHANGING 来做到这一点,当您看到有人尝试移动时,将坐标更改回应该在的位置。例如

    switch (uMsg)
    {
        case WM_WINDOWPOSCHANGING:
            if (!(reinterpret_cast<LPWINDOWPOS>(lParam)->flags & SWP_NOMOVE))
            {
                reinterpret_cast<LPWINDOWPOS>(lParam)->x = g_iMyXCoord;
                reinterpret_cast<LPWINDOWPOS>(lParam)->y = g_iMyYCoord;
            }
            return 0;
    }
    

    您可能需要为此添加一些智能,以区分用户尝试的移动和您自己的程序做出的移动(或系统在必要时做出的移动 - 例如,如果监视器消失)。

    即使你说它不起作用,我原以为你也可以通过捕获 WM_NCHITTEST 并在返回 HTCAPTION 时返回 HTBORDER 来做到这一点 - 但是你必须通过 sub - 对窗口进行分类而不是在DialogProc 中(因为您需要先调用默认处理程序,然后处理/更改返回值)。 WM_SYSCOMMAND 相同(通过系统菜单捕捉用户尝试的移动)。

    【讨论】:

    • 谢谢。同时我发现: case WM_WINDOWPOSCHANGING: { if (MakeFixedWindow) { LPWINDOWPOS p = (LPWINDOWPOS)lParam; p->标志 = SWP_SHOWWINDOW | SWP_NOMOVE; } 返回真;如果初始加载/显示完成,MakeFixedWindow 为真。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多