我们有一个MFC应用程序,它以嵌入模式运行,并通过其COM接口通过其他应用程序调用。在嵌入模式下,它不应该聚焦,但是我们看到它正在占据焦点,用户键盘输入从当前应用程序更改为我们的MFC应用程序。
我一直在寻找一种解决方法,一旦在嵌入式中运行的MFC应用程序获得焦点,就立即删除焦点。
对于变通方法,我通过映射消息WM_SETFOCUS注册了OnSetFocus()方法,并尝试使用以下窗口api SetWindowPos()从我的MFC应用程序中删除焦点,但这也无济于事。
void CTestMFCApplicationView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
OutputDebugString(L"OnSetFocus\r\n");
// TODO: Add your message handler code here
CView::SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOACTIVATE);
}
答案 0 :(得分:0)
我要做的是在OnSetFocus()中设置断点,以查看触发要设置焦点的内容。你可以在那里做些什么来防止焦点被设置。
如果你无法阻止,那么下一个选择就是做出反应。我认为SetWindowPos()是错误的方式。之前具有焦点的窗口是在OnSetFocus()中传递的pOldWnd参数。您可以尝试使用pOldWnd-> SetFocus()而不是SetWindowPos()。这可能会奏效,也可能不会。更好的选择可能是向自己发布消息,例如WM_USER + 1或WM_APP + 1,或者以pOldWnd的HWND作为参数的已注册消息。当您收到该消息时,请使用WinAPI调用:: SetFocus(hWnd)。