防止窗户移动

时间:2013-05-22 18:15:20

标签: c++ windows winapi

我目前有一个在win32窗口中运行的小游戏。我刚注意到,当我按住窗口顶部(带有关闭按钮的栏)时,它会冻结我的应用程序。我想禁用它,因为它设法完全破坏我的应用程序(计时器继续计数)。

似乎即使是用于创建窗口的最简约设置,它仍然具有此功能。我怎么能禁用它?我目前有:

 HWND hWnd = CreateWindowW( L"Game",L"Game",
                          0x00000000L | 0x00080000L,
                          wr.left,
                          wr.top,
                          wr.right-wr.left,
                          wr.bottom-wr.top,
                          NULL,
                          NULL,
                          wc.hInstance,
                          NULL );

我读到拖动时我的线程被忽略了,如果我被迫使用2个线程,有人可以提供一个小的使用示例吗?

或者我应该停止计时器? (我应该抓住什么信息,甚至会被抓住?)

更新

我正在使用我的时间类的实例来处理类似的时间:

Timer::Timer() {
    __int64 frequency;
    QueryPerformanceFrequency( (LARGE_INTEGER*)&frequency );
    invFreqMilli = 1.0f / (float)((double)frequency / 1000.0);
    StartWatch();
}

void Timer::StartWatch() {
    startCount = 0;
    currentCount = 0;
    watchStopped = false;
    QueryPerformanceCounter( (LARGE_INTEGER*)&startCount );
}

我的Win32消息循环包含:mousemove,keyup和keydown。

3 个答案:

答案 0 :(得分:2)

当DefWindowProc在wParam中使用SC_MOVE或SC_SIZE处理WM_SYSCOMMAND时,它会进入一个循环,直到用户通过释放鼠标按钮或按Enter或escape来停止它。这样做是因为它允许程序通过处理WM_PAINT和WM_NCPAINT消息来呈现客户区(您的小部件或游戏或其他任何内容)以及边框和标题区域(您仍应在Window Procedure中接收这些事件)。

它适用于普通的Windows应用程序,这些应用程序由于接收消息而在其Window Procedure中进行大部分处理。它只影响在窗口过程之外进行处理的程序,例如游戏(通常是全屏但不受影响)。

然而,有一种解决方法:自己处理WM_SYSCOMMAND,调整大小或移动自己。这需要付出很多努力,但可能证明是值得的。或者,您可以使用setjmp / longjmp在发送WM_SIZING时从Window Procedure中逃脱,或者沿着相同的行使用Windows Fibers;这些都是黑客的解决方案。

我在上周末解决了它(使用第一种方法),如果您感兴趣我已经将代码发布到sourceforge上的公共域。只需确保阅读README,特别是警告部分。这是:https://sourceforge.net/projects/win32loopl/

答案 1 :(得分:1)

由于用户可以移动窗口的标题栏,您可以完全删除该标题栏和边框。有关示例,请参阅“opening a window that has no title bar with win32”。

当游戏启动或暂停时,您可以显示自己的UI元素,以允许用户在这些特定情况下移动游戏窗口,但仅限于此。

答案 2 :(得分:0)

您可以使用WM_ENTERSIZEMOVEWM_EXITSIZEMOVE消息检查尺寸/移动循环。