#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. Этого не происходит. И довольно сомнительно, почему решение, которое работает для всех, не подходит для вас.