无法接收/捕获 Windows 消息

Posted

技术标签:

【中文标题】无法接收/捕获 Windows 消息【英文标题】:Unable to receive / capture Windows Messages 【发布时间】:2014-08-20 06:45:45 【问题描述】:

我对@9​​87654321@ 和Message handling 上下文还很陌生。

我有一个DLL 消费者应用程序,它有一个CFrameWndEx 派生类CMainFrame。现在这会调用一个DLL,它将一个CDialog 等放入这个MainFrame 窗口。

我希望在我的应用程序中接收某些消息。

所以我所做的是,在 DLL 使用者应用程序的消息映射中声明预期消息,并定义适当的消息处理程序。

现在,即使我可以看到正在向应用程序发送那些已注册的消息,我也无法在消费者窗口中接收/处理它们,也就是说,当这些消息被广播时,什么也没有发生。

Mainfrm.h

class CMainFrame : public CFrameWndEx

public:
    CMainFrame();
protected: 
    DECLARE_DYNAMIC(CMainFrame)
public:
    void OnFileDialogdisplay(void);
    afx_msg LRESULT OnLogonChanged(WPARAM,LPARAM);
    afx_msg LRESULT OnLanguageChanged(WPARAM,LPARAM);
    afx_msg LRESULT OnShutdownRequested(WPARAM,LPARAM);
    afx_msg LRESULT OnReconnectServer(WPARAM,LPARAM); 
    afx_msg LRESULT OnChangeRole(WPARAM,LPARAM); 

Mainfrm.cpp

<some header files>
static UINT UWM_LOGON_CHANGED = ::RegisterWindowMessage(UWM_LOGON_CHANGE);
static UINT UWM_LANGUAGE_CHANGED = ::RegisterWindowMessage(UWM_LANGUAGE_CHANGE);
static UINT UWM_RECONNECT = ::RegisterWindowMessage(UWM_RECONNECT_SERVER);
static UINT UWM_SHUTDOWN_REQUESTED = ::RegisterWindowMessage(UWM_REQUEST_SHUTDOWN);
static UINT UWM_ROLE = ::RegisterWindowMessage(UWM_ROLE_CHANGE);

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    ON_WM_CREATE()
    ON_WM_SETFOCUS()
    ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
    ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
    ON_COMMAND(ID_FILE_DIALOGDISPLAY, &CMainFrame::OnFileDialogdisplay)
    ON_REGISTERED_MESSAGE(UWM_LOGON_CHANGED, OnLogonChanged)
    ON_REGISTERED_MESSAGE(UWM_LANGUAGE_CHANGED, OnLanguageChanged)
    ON_REGISTERED_MESSAGE(UWM_SHUTDOWN_REQUESTED, OnShutdownRequested)
    ON_REGISTERED_MESSAGE(UWM_RECONNECT, OnReconnectServer) 
    ON_REGISTERED_MESSAGE(UWM_ROLE, OnChangeRole) 
    //ON_WM_NCCALCSIZE()
END_MESSAGE_MAP()

//code to register to Main server application to be able to receive messages

void manageregistration(CMainFrame* pFrame, bool flag)

    if (flag) 
     // registration
        HWND MyHandle = (HWND)pFrame->GetActiveWindow();

        RegisterApmsClientPgm(_T("AAUserInterface"), MyHandle);
    


//Handlers

LRESULT CMainFrame::OnShutdownRequested(WPARAM,LPARAM lp)

    AfxMessageBox(_T("Error"),MB_ICONERROR | MB_OK);
    testProgram();
    return 0;


LRESULT CMainFrame::OnChangeRole(WPARAM,LPARAM lp)

    AfxMessageBox(_T("Error"),MB_ICONERROR | MB_OK);
    testProgram();
    return 0;


// etc etc.etc.

所以,在这一切之后,我可以看到消费者应用程序已注册为从另一个广播它们的应用程序接收这些消息。

但是,在创建消息被广播的条件时,我可以从接收它们的其他应用程序中验证它们的状态,我的应用程序中没有捕获到这样的消息。

我不确定问题可能出在哪里。窗口始终位于顶部,尽管其中包含另一个 CDialog 派生的 DLL

【问题讨论】:

您应该在每个有问题的窗口上使用 Spy++ 来查看实际接收消息的窗口(如果有)。此外,您没有发布实际发送注册消息的代码。很高兴看到。 我使用了Spy++,并创建了一个条件,以便我的应用程序可以接收消息。但我什么也没得到。消息调度程序应用程序使用HWND 发送消息。我只是想知道我是否必须发送父窗口的HWND,或者CDialog 窗口的@ DLL. Also, I cannot get the HWND Of the DLL 对话框窗口,FindWindowEx 从@ 987654340@ 类不返回任何内容,尽管Spy++ 表明Dialog Window 是使用名称创建的。 您发布的代码意味着您将在大型机类中处理消息。 是的,这就是我想要处理的地方。我试图获得活动窗口的HWND,并用它向消息调度程序注册。但是,当消息发送时,它们不会被 Window 捕获。那么MainFrame 中的GetActiveWindow() 函数是否会返回其他内容,可能是因为可见性设置?或者我还需要做些什么来接收这些消息? 尝试使用 pFrame->m_hWnd。您不能假设 Mainframe 窗口始终处于活动状态。 【参考方案1】:

尝试使用 pFrame->m_hWnd。您不能假设 Mainframe 窗口始终处于活动状态。

【讨论】:

以上是关于无法接收/捕获 Windows 消息的主要内容,如果未能解决你的问题,请参考以下文章

Windows钩子的使用

如何在没有 Windows 窗体的情况下接收即插即用设备通知

如何从服务接收 OutputDebugString?

Windows 消息 - 捕获来自另一个 API 的调用

qt捕获全局windows消息

如何捕获从此菜单发送的 Windows 消息?