Win32 App(Aero):防止对话框移动

时间:2013-04-23 12:50:56

标签: winapi user-interface win32gui

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以通过处理WM_WINDOWPOSCHANGING来执行此操作,当您看到尝试移动时,请将坐标更改回原来的位置。 E.g。

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并在HTBORDER返回时返回HTCAPTION来做到这一点 - 但是你会必须通过对窗口进行子类化而不是DialogProc来进行此操作(因为您需要先调用默认处理程序然后处理/更改返回值)。 WM_SYSCOMMAND相同(通过系统菜单捕获用户尝试)。