Я написал некоторый код, чтобы определить, находится ли определенное окно в границах рабочего стола.Почему-то это не работает.Для каждого окна, независимо от того, находится оно внутри или снаружи рабочего стола, возвращается false
.Что-то здесь ужасно не так, но, глядя на этот кусок кода в течение 3 часов, я все еще не знаю, в чем проблема.Если я пытаюсь прочитать структуру RECT из указателя, отправленного в WPARAM PMSG, я получаю AccessViolationException.Почему это происходит?
Мой код выглядит следующим образом и всегда возвращает false:
static bool IsInBounds(HWND window)
{
DEVMODE d;
d.dmSize = sizeof(DEVMODE);
BOOL b = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &d);
if(b == FALSE)
{
PostMessage(FindWindow(NULL, L"Window #1"), RegisterWindowMessage(L"FMSG"), (WPARAM)window, NULL);
}
RECT R;
GetWindowRect(window, &R);
POINT p = POINT();
p.x = (LONG)d.dmPelsWidth;
p.y = (LONG)d.dmPelsHeight;
PostMessage(FindWindow(NULL, L"Window #1"), RegisterWindowMessage(L"PMSG"), (WPARAM)&R, d.dmPelsWidth);
if(R.right < 0 || R.bottom < 0 || R.left > (LONG)d.dmPelsWidth || R.top > (LONG)d.dmPelsHeight)
{
return false;
}
return true;
}
EDIT: после вызова IsInBounds, который возвратил ошибку 1400 (Неверный дескриптор окна), ноперед возвратом из ответного обратного вызова я позвонил IsWindow(window)
, чтобы проверить, действителен ли мой дескриптор.Правда в том, что это на деле действительная ручка!Как это может быть, что GetWindowRect говорит, что его недействительный дескриптор?
EDIT: я попытался MonitorFromWindow как sujested, но он возвратил NULL, и вызов GetLastError привел к ошибке №1400, что мне уже знакомо.Похоже, что MonitorFromWindow неявно вызывает GetWindowRect.Меня не волнует размер, но есть ли другой способ получить координаты окна из дескриптора?