检测鼠标在子窗口外的点击

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 上的窗口即可完成此操作。

以上是关于检测鼠标在子窗口外的点击的主要内容,如果未能解决你的问题,请参考以下文章

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

如何在子窗口小部件下使用 eventfilter 来捕获自定义事件

qt中当鼠标点击子窗口时如何让父窗口响应鼠标点击事件?

C# winform 父窗口子窗口按钮控制

c# 子窗口如何将信息传至父窗口

C#中关闭子窗口的同时刷新父窗口的办法?