WinAPI. Проверьте, было ли завершено изменение размера окна

#c #winapi

#c #winapi

Вопрос:

У меня есть приложение на 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 amp;amp; !m_isWindowResizing)
    {
        m_isWindowResizing = true;
    }
    else if (lpmsg->message == WM_EXITSIZEMOVE amp;amp; 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) amp;amp; !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:

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

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

Комментарии:

1. Я обновил свой исходный код реализацией вашего варианта. Вы имели в виду что-то вроде того, что я реализовал?

2. К сожалению, перехватывать эти сообщения — не мой вариант. Существуют ли какие-либо другие способы проверить, изменяется ли размер окон приложения?

3. Если вы не понимаете последствий использования глобального подключения, еще раз прочтите документацию : «Все функции глобального подключения должны быть в библиотеках «.

4. Вот почему это решение мне не подходит, и вот почему мне интересно, есть ли какие-либо другие варианты проверки того, находится ли окно в состоянии изменения размера.

5. Этого не происходит. И довольно сомнительно, почему решение, которое работает для всех, не подходит для вас.