WinAPI.Проверьте, завершено ли изменение размера окна - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть приложение C ++ (используется для общего доступа к приложению через сеть). Мне нужно обновить область приложения на стороне клиента, когда его размер был изменен на стороне сервера. Для этого один раз в определенный период времени я звоню GetWindowPos, чтобы проверить, было ли изменено окно. Но я не хочу отправлять информацию, когда окно находится в состоянии изменения размера, и отправлять информацию только после завершения изменения размера. Я заметил, что в Windows 8.1 и Windows 10 GetWindowPos возвращает одинаковые значения, когда окно находится в состоянии изменения размера, однако в Windows 7 оно возвращает разные значения, когда окно находится в состоянии изменения размера. Итак, вопрос в том, как понять, находится ли окно в состоянии изменения размера?

UPD : Реализация варианта WM_ENTERSIZEMOVE - WM_EXITSIZEMOVE

void WindowsDisplayHelperMasterWindow::SetMsgHook()
{
    m_pThis = this;
    m_msgHook = SetWindowsHookEx(WH_GETMESSAGE, MsgPoc, NULL, 0);
}

Статическая функция, которая вызывает нестатический метод класса:

LRESULT CALLBACK WindowsDisplayHelperMasterWindow::MsgPoc(int code, WPARAM wParam, LPARAM lParam)
{
    if (m_pThis != nullptr)
    {
        return m_pThis->GetMsgProcHook(code, wParam, lParam);
    }
    return CallNextHookEx(0, code, wParam, lParam);
}

Функция крюка:

LRESULT CALLBACK WindowsDisplayHelperMasterWindow::GetMsgProcHook(int code, WPARAM wParam, LPARAM lParam)
{
    if (code < 0)
    {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    MSG* lpmsg = (MSG*)lParam;
    if (lpmsg->hwnd != m_windowHandle)
    {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    if (lpmsg->message == WM_ENTERSIZEMOVE && !m_isWindowResizing)
    {
        m_isWindowResizing = true;
    }
    else if (lpmsg->message == WM_EXITSIZEMOVE && m_isWindowResizing)
    {
        m_isWindowResizing = false;
    }

    return CallNextHookEx(0, code, wParam, lParam);
}

m_pThis и m_msgHook являются статическими членами класса:

WindowsDisplayHelperMasterWindow* WindowsDisplayHelperMasterWindow::m_pThis = nullptr;
HHOOK WindowsDisplayHelperMasterWindow::m_msgHook = NULL;

А вот и сам чек:

if (!m_displayMode.IsEqualGeometry(displayMode) && !m_isWindowResizing)
{
    DUMPER_DEBUG("DS_ERROR_MODE_CHANGED");
    return DS_ERROR_MODE_CHANGED; // depending on this value server asks client to update application's window area
}

Спасибо.

1 Ответ

4 голосов
/ 05 апреля 2019

Окно получает сообщение WM_ENTERSIZEMOVE после того, как оно вошло в модальный цикл перемещения и изменения размера.Окно получает сообщение WM_EXITSIZEMOVE после выхода из модального цикла перемещения или изменения размера.

Если вы отслеживаете эти два сообщения, вы знаете, когда окно находится в состоянии перемещения и изменения размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...