我写了一些代码来确定某个窗口是否在桌面范围内。
不知何故,它不起作用。对于每个窗口,无论它是在桌面内部还是外部,false
都会返回。这里有些地方很不对劲,但是在盯着这段代码3个小时之后,我仍然不知道问题出在哪里。如果我尝试从 PMSG 的 WPARAM 中发送的指针读取 RECT 结构,我会收到 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;
}
编辑:在调用 IsInBounds 后,它返回了错误号 1400(无效的窗口句柄),但在从钩子回调返回之前,我调用IsWindow(window)
了 ,看看我的句柄是否仍然有效。事实是:它确实是一个有效的句柄!GetWindowRect 怎么会说它的句柄无效?
编辑:我尝试了 MonitorFromWindow 作为 sujested,但它返回 NULL,并且调用 GetLastError 导致错误号。1400,我已经很熟悉了。看起来 MonitorFromWindow 隐式调用 GetWindowRect。我不在乎大小,但是还有另一种方法可以从句柄获取窗口坐标吗?