gpt4 book ai didi

windows - 找到一个点下的所有窗口

转载 作者:可可西里 更新时间:2023-11-01 12:48:25 24 4
gpt4 key购买 nike

我想找到桌面上给定点下方的所有顶级窗口(桌面的子窗口)。我找不到这方面的 API。

我的场景是我在屏幕上拖动一个窗口并想将它放到另一个(已知)窗口中。我可以点击测试目标窗口的边界,但这并不能告诉我它是否被另一个(未知)窗口遮挡。使用 WindowFromPoint 和 friend 是行不通的,因为被拖动的窗口必然在鼠标的正下方。所以我想知道我是否可以获得鼠标位置处的所有窗口,并查看它们以查看我正在跟踪的窗口之一是否在我正在拖动的窗口的正下方。

有没有办法在每次鼠标拖动时不求助于 EnumDesktopWindows/GetWindowRect 来做到这一点?或者我可能还缺少另一种解决方案。

最佳答案

如果您好心询问,WindowFromPoint 将忽略您的窗口(当前正在拖动的窗口)并返回下一个窗口。这就是 Internet Explorer 在您拖动选项卡时所做的事情。

为此:

  1. 在被拖动的窗口中处理WM_NCHITTEST
  2. 在拖动过程中返回 HTTRANSPARENT。否则调用默认窗口过程。
  3. WindowFromPoint will ignore HTTRANSPARENT 窗口,但仅属于调用线程的窗口。这对您来说应该不是问题,因为无论如何您都应该从窗口所有者线程调用 WindowFromPoint
  4. 确保在传递给 WindowFromPoint 的点上没有子窗口,或者也为这些子窗口处理 WM_NCHITTEST

疑难解答(如果您仍然从 WindowFromPoint 获取窗口)

  1. 测试 GetCurrentThreadID() == GetWindowThreadProcessId(WindowFromPoint(), 0) 以确保您从正确的线程调用
  2. WM_NCHITTEST 中,测试 hwnd 参数是否等于您从 WindowFromPoint() 获得的值

示例(矩形内的区域从 WindowFromPoint 返回底层窗口):

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static const RECT s_TransparentRect = {100, 100, 200, 200};

switch (message)
{
case WM_NCCREATE:
SetTimer(hWnd, 1, 100, 0);
break;
case WM_TIMER:
{
POINT cursorPos;
GetCursorPos(&cursorPos);

TCHAR buffer[256];
_snwprintf_s(buffer, _countof(buffer), _TRUNCATE, _T("WindowFromPoint: %08X\n"), (int)WindowFromPoint(cursorPos));
SetWindowText(hWnd, buffer);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
Rectangle(ps.hdc, s_TransparentRect.left, s_TransparentRect.top, s_TransparentRect.right, s_TransparentRect.bottom);
EndPaint(hWnd, &ps);
}
break;
case WM_NCHITTEST:
{
POINT cursorPos;
GetCursorPos(&cursorPos);
MapWindowPoints(HWND_DESKTOP, hWnd, &cursorPos, 1);

if (PtInRect(&s_TransparentRect, cursorPos))
return HTTRANSPARENT;
}
break;
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

关于windows - 找到一个点下的所有窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37446702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com