0

私はコンテキストにかなり慣れてMFCMessage handlingません。

派生クラスを持つDLLコンシューマ アプリケーションがあります。これで a が呼び出され、 aなどがこのウィンドウに表示されます。CFrameWndExCMainFrameDLLCDialogMainFrame

アプリケーションで特定のメッセージを受信したいと考えています。

そこで、DLL コンシューマ アプリケーションのメッセージ マップで予想されるメッセージを宣言し、適切なメッセージ ハンドラを定義しました。

アプリケーションがこれらの登録されたメッセージを送信していることはわかりますが、Consumer Window でメッセージを受信/処理することはできません。つまり、それらのメッセージがブロードキャストされても何も起こりません。

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

4

1 に答える 1

1

pFrame->m_hWnd を使用してみてください。メインフレーム ウィンドウが常にアクティブであるとは限りません。

于 2014-08-21T12:09:50.493 に答える