【问题标题】:How to keep the focus on the top window of 1st screen after clicking 2nd screen单击第二个屏幕后如何将焦点保持在第一个屏幕的顶部窗口
【发布时间】:2019-04-26 18:19:43
【问题描述】:

我们有一个桌面(第一个屏幕)来显示图像和另一个触摸屏(第二个屏幕)用于控制,我们在触摸屏上编写了一个虚拟键盘(html&javascript),理想情况下当我们触摸触摸屏上的按键时,我们可以输入第一个桌面的编辑框中的文本(在输入对话框窗口中)。现在的问题是当我们触摸触摸屏时鼠标丢失(最初是在第一个桌面的输入对话框中),所以我们必须在 C++ 程序中创建一个全局窗口,并将每个可能的输入对话框窗口手动复制到这个全局窗口当它在使用时,我们还需要在这个输入对话框窗口中为每个可能的编辑框设置焦点。请看这个:

对于每个可能的输入对话框,我们添加

    extern HWND activeInputWindow;
    activeInputWindow=m_Edit_Name.m_hWnd;

对于这个窗口中每个可能的输入框,我们必须添加

    activeInputWindow=GetDlgItem(IDC_EDIT_TEST)->m_hWnd;

然后程序总是这样做以在单击触摸屏后返回原始窗口(第二个窗口)

extern HWND activeInputWindow;
if(IsWindow(activeInputWindow)) 
  ::SetFocus(activeInputWindow);

假设我们有10个输入窗口,每个窗口有10个输入框,那么我需要编码100个地方!必须有一些简单的方法,windows osk.exe(虚拟键盘)对此没有问题,但我们必须使用我们自己的虚拟键盘....我尝试了GetTopWindow()和GetForegroundWindow()但不起作用..非常感谢帮助

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    这是试图使用错误的工具来解决问题。您真正想要的是一个接收输入但拒绝激活的窗口。为此,请通过返回 MA_NOACTIVATE 来处理 WM_MOUSEACTIVATE 消息。这也适用于触摸输入。

    请参阅 How can I have a window that rejects activation but still receives pointer input? 了解所有细节。

    【讨论】:

    • 谢谢,我想它会记住鼠标的位置,点击触摸屏后,鼠标位置仍然保持在主屏幕中(即使鼠标消失,如果你稍微移动鼠标,它出现在旧位置),但窗口仍转移到触摸屏。我会继续研究这个。
    【解决方案2】:

    问题是您的虚拟键盘正在窃取编辑控件的焦点。您需要防止这种情况发生。

    尝试为窗口样式或thisthis 答案中的其他方法设置标志WS_EX_NOACTIVATE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多