MFC Win32 |单击工具栏按钮后未收到 LButtonUp (CMFCToolBarButton::OnClick)

MFC Win32 | LButtonUp not being received after clicking toolbar button (CMFCToolBarButton::OnClick)

我想要达到的目标

嗯,标题可能没有很好地说明问题,所以就这样吧:

我正在尝试使用 MFC 创建一个 Win32 应用程序,让您可以编辑和检查其他 windows。 我希望用户能够 select 其他 windows.

我从 sysinternals 应用程序(如 ProcessExplorer)工具栏上的“查找 Window 进程”工具中获得灵感。

它的工作方式是你点击,然后 window 消失,然后你把它拖到你想要 select 的 window 上。它周围会弹出一个边框,当您松开时,它 select 是 window 鼠标结束。

我的问题

我面临的问题是我不知道如何检测用户何时在另一个 window 上松开鼠标。

我在 CMFCToolBarButton

中使用 OnClick 检测鼠标按下

我尝试使用 SetCapture(),但没有任何效果。

我尝试使用 OnNcLButtonUpOnLButtonUp 但它们都不起作用。 (旁边 SetCapture

到目前为止,这是我的代码 (ChildView.cpp):

BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_WM_PAINT()
    ON_UPDATE_COMMAND_UI(ID_TB_LOCATEWINDOW, &CChildView::EnableToolbarButton)
    ON_UPDATE_COMMAND_UI(ID_TOOLS_MESSAGELAUNCHER, &CChildView::EnableToolbarButton)
    ON_WM_XBUTTONUP()
//  ON_WM_LBUTTONUP()
    ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()

....


void CChildView::LocateWindow()
{
    GetParentFrame()->ShowWindow(SW_MINIMIZE);

    SetCapture();
}


void CChildView::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
    ReleaseCapture();

    GetParentFrame()->ShowWindow(SW_NORMAL);

    MessageBox(L"Stuff", L"");

    CWnd::OnNcLButtonUp(nHitTest, point);
}

我想提一下,单击工具栏按钮时会调用 LocateWindow 函数(如鼠标按下,而不是鼠标按下和向上) 它是从 OnClick 函数调用的。

这是相关代码: (我把按钮换成了OnToolbarReset

// CLocateWindowButton.cpp : implementation file
//

#include "pch.h"
#include "WindowHacker.h"

#include "MainFrm.h"
#include "CLocateWindowButton.h"

// CLocateWindowButton

IMPLEMENT_SERIAL(CLocateWindowButton, CMFCToolBarButton, 1)

// CLocateWindowButton member functions

CLocateWindowButton::CLocateWindowButton()
{
}

CLocateWindowButton::CLocateWindowButton(CMainFrame* mainFrame, UINT uiCmdID, LPCTSTR lpszText) : CMFCToolBarButton(uiCmdID, NULL, lpszText)
{
    this->mainFrame = mainFrame;
}


BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
    //(CMainFrame*)m_pWndParent->LocateWindow();
    mainFrame->LocateWindow();

    return FALSE;
}

void CLocateWindowButton::CopyFrom(const CMFCToolBarButton& src)
{
    CMFCToolBarButton::CopyFrom(src);
    mainFrame = ((CLocateWindowButton&)src).mainFrame;
}


//void CLocateWindowButton::AssertValid() const
//{
//  CMFCToolBarButton::AssertValid();
//
//  // TODO: Add your specialized code here and/or call the base class
//}

更新:

当我把它放在 LButtonDown 事件中时它似乎工作,当它从 CMFCToolBarButton

中的 OnClick 检测到时它似乎不起作用

我发现在CMFCToolBar::OnLButtonUp中,在按钮中调用OnClick后,它重新捕获光标,使我们的SetCapture无效。

但是如果我 return TRUE 而不是 OnClick 中的 FALSE,则不会重新捕获鼠标。

所以改变这个:

BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
    //(CMainFrame*)m_pWndParent->LocateWindow();
    mainFrame->LocateWindow();

    //ReleaseCapture();
    this->mainFrame->SetCapture();

    return FALSE;
}

为此:

BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
    //(CMainFrame*)m_pWndParent->LocateWindow();
    mainFrame->LocateWindow();

    //ReleaseCapture();
    this->mainFrame->SetCapture();

    return TRUE; // The line is changed here
}

邮件改为发送至 CMainFrame