无法接收/捕获Windows消息

时间:2014-08-20 06:45:45

标签: c++ dll mfc windows-messages window-messages

我对MFCMessage handling上下文很新。

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

我希望在我的申请中收到某些消息。

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

现在,即使我可以看到应用程序正在发送这些已注册的消息,但我无法在消费者窗口中接收/处理它们,即,当这些消息被广播时没有任何反应。

为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.

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

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

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

1 个答案:

答案 0 :(得分:1)

尝试使用pFrame-&gt; m_hWnd。您不能假设大型机窗口始终处于活动状态。