gpt4 book ai didi

c++ - 无法接收/捕获 Windows 消息

转载 作者:行者123 更新时间:2023-11-28 06:43:55 25 4
gpt4 key购买 nike

我对 MFCMessage 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

最佳答案

尝试使用 pFrame->m_hWnd。您不能假设大型机窗口始终处于事件状态。

关于c++ - 无法接收/捕获 Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25398336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com