【问题标题】:MFC Application running in embedded mode taking focus以嵌入式模式运行的 MFC 应用程序获得焦点
【发布时间】:2015-02-26 00:21:00
【问题描述】:

我们有一个 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);
}

【问题讨论】:

    标签: visual-c++ com mfc


    【解决方案1】:

    我要做的是在 OnSetFocus() 中设置一个断点,以查看是什么触发了要设置的焦点。您可以在那里做一些事情来防止焦点被设置。

    如果您无法阻止,那么下一个选择就是做出反应。我认为 SetWindowPos() 是错误的方式。先前具有焦点的窗口是在 OnSetFocus() 中传递的 pOldWnd 参数。您可以尝试使用 pOldWnd->SetFocus() 代替 SetWindowPos()。这可能有效,也可能无效。更好的选择可能是向自己发布一条消息,例如 WM_USER+1 或 WM_APP+1 或一条以 pOldWnd 的 HWND 作为参数的注册消息。当您收到该消息时,使用 WinAPI 调用 ::SetFocus(hWnd)。

    【讨论】:

    • 作为一种解决方法,我确实尝试使用 pOldWnd->SetFocus() 将焦点带回上一个窗口。但是我将 pOldWnd 设置为 NULL,因此这个实现在我的最后不起作用。而且我不明白为什么我会得到 NULL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多