我正在为基于 MFC 的旧应用程序(MFC-app)构建一个测试应用程序(testApp)。我正在尝试使用它们之间的消息传递来模拟 MFC 应用程序上的鼠标单击。我能够成功地从 MFC 应用程序菜单中调出对话框。但是,当我尝试在 MFC 应用程序的视图上模拟鼠标单击时,它似乎不起作用。
我的主要问题是在尝试使用 SendMessage,PostMessage 函数与 CView 的派生类进行通信时是否存在任何已知限制?另请注意,我正在重用 ON_COMMAND() 处理程序来处理我的消息,因为目标是通过我的 TestApp 执行通过菜单选项单击调用的相同处理程序。有关我尝试的内容和遇到的错误的更多详细信息:
尝试1。
测试应用:
::SendMessage 到 MFC 应用程序的 CMainFrame 要求它以所需的输入调出 CView。----> 这行得通
MFC应用程序:
CMainFrame:使用此处描述的方法检索 CView (CDesignView) 的派生类及其 HWND 句柄的 ptr:https: //support.microsoft.com/en-us/kb/108587 使用的代码粘贴如下:
CMDIChildWnd * pChild = MDIGetActive();
if ( !pChild )
return -1;
CView *pView = pChild->GetActiveView();
if (!pView) {
MessageBox(_T("Could not get a handle to the design"), _T("Test2 Error"), MB_OK);
return -1;
}
// Fail if view is of wrong kind
if ( !pView->IsKindOf( RUNTIME_CLASS(CDesignView) ) ) {
MessageBox(_T("View obtained is not of type DesignView"), _T("Test2 Error"), MB_OK);
return -1;
}
CDesignView* designView = (CDesignView*)pView ;
HWND view_hWnd = designView->m_hWnd ;
if (!view_hWnd) {
MessageBox(_T("designView handle could not be obtained"), _T("Test2 Error"), MB_OK);
return -1;
}
-------------------> 此时代码中 view_hWnd 和 designView 的值都不是 NULL。但是,当我将这些用于 SendMessage 时,它会失败:
designView->PostMessageW(ID_DESIGN_xxx,NULL, NULL) ;
--> 这不起作用,即应用程序没有变化,就好像从未发送过消息一样。ID_DESIGN_xxx 处理程序永远不会被调用。该处理程序在 CDesignView 消息映射中声明如下:
ON_COMMAND(ID_DESIGN_xxx , OnXXX)
(注意:我正在重新使用 MFCApp 已经用于 CDesignView 上与此功能对应的菜单选项的处理程序,因为目标是对其进行测试)
-------------------->当我将其替换为直接调用处理程序时,如下所示:
设计视图->OnStarOrder() ;
然而,这不是我想要的行为,因为它涉及将太多 View 处理程序公开,并且也违背了密切模拟实际使用模型的测试应用程序的目的。
------------------->为了进一步调试,我还尝试调用本机 WM_xxx 消息,如下所示。
designView->PostMessageW(WM_CLOSE,NULL, NULL) ;
这在此检查中给出了异常失败: IsKindOf( RUNTIME_CLASS(CView) 断言失败。
尝试 2
我还尝试让 TestApp 将消息发送到 MFCApp CDesignView 而不是它自己的 MainFrame 如上所述。因此,我使用 ON_COPY 消息将上述代码中的 CDerivedView 句柄 view_hWnd 传递给了 TestApp。然后 TestApp 执行 ::SendMessage(view_hWnd,WM_CLOSE,NULL, NULL)。得到了同样的错误。这种方法试图排除在发送消息时 CDesignView 不是活动窗口的可能性。在这种情况下,我在让 TestApp 发送消息之前手动单击 MFCApp 的 CView。
这些似乎都不起作用。您可以提供的任何建议都将大有帮助。提前致谢!