检测鼠标在子窗口外的点击
Posted
技术标签:
【中文标题】检测鼠标在子窗口外的点击【英文标题】:Detect mouse click outside child window 【发布时间】:2021-06-10 14:05:35 【问题描述】:当用户单击窗口外的某个位置时,我想销毁一个子窗口。我尝试使用 SetCapture() 来检测鼠标点击。代码如下:
HWND textbox;
//IN case WM_CREATE:
CreateWindowEx(NULL, L"BUTTON", L"button!",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 150, 40, hwnd,
(HMENU)IDC_TEXTBOX, NULL, NULL);
textbox = CreateWindowEx(
NULL, L"EDIT", NULL,
WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_BORDER,
100, 100, 300, 200, hwnd, (HMENU)ID_TEXTBOX, NULL, NULL
);
SetWindowText(textbox, L"the initial text");
//IN CASE WM_ONLBUTTONDOWN:
if (textbox != NULL)
if (SetCapture(textbox) == NULL)
ReleaseCapture();
DestroyWindow(textbox);
textbox = NULL;
当我在其区域之外单击时,该窗口确实被破坏了。但是,当我单击按钮时,它并没有像我预期的那样被破坏。我希望当用户单击 WHEREVER 在其窗口之外 时,子窗口会被销毁。为什么我的代码失败了?我该怎么做呢?
编辑:这是一个屏幕截图,让事情变得清晰。该窗口只有一个带有初始文本和一个按钮的编辑窗口。如上所述,当我在其窗口外单击时,子窗口会消失,但是当我单击按钮(也是在窗口外)时,编辑窗口仍然存在。
【问题讨论】:
很难说有什么问题,因为我们看不到minimal reproducible example。尽管您可能想在创建后立即SetCapture
,并处理WM_CAPTURECHANGED
。
【参考方案1】:
根据this thread,我发现EN_KILLFOCUS 通知将在编辑控制文档中为您工作。
【讨论】:
当用户使用键盘离开时,您会收到EN_KILLFOCUS
。问题是专门要求鼠标输入。捕获鼠标输入并销毁WM_CAPTURECHANGED
上的窗口即可完成此操作。以上是关于检测鼠标在子窗口外的点击的主要内容,如果未能解决你的问题,请参考以下文章