Windows是否处于文本输入模式?

时间:2019-07-09 01:35:05

标签: c++ winapi

我需要一种可靠的方法来确定我是否键入了将出现在屏幕上的字符,即是否出现在文本框或其他输入控件中(在任何过程中)。这对于看起来似乎具有自己输入元素的浏览器也同样适用。

我尝试使用辅助功能api,但是使用它来检查文本框似乎并不可靠。

我还尝试使用GetGUIThreadInfo来获得插入符号的位置,这也不可靠。

任何建议如何检查是否有任何可见的具有键盘焦点的输入框?

原因::我正在添加此问题的用例。我们有一个后台可访问性过程来监视所有键盘输入。 (用户完全了解此过程,可以修改输入发生的情况)。在某些情况下,输入被删除(通过退格键),并由其他内容代替。当没有焦点的输入框时,我们不需要或不需要发送所需的退格键。

1 个答案:

答案 0 :(得分:0)

如上所述。检测控件何时可以处理退格键不是很可靠。但是,从头上解决问题还是有帮助的。根据我们的要求,检测控件何时无法处理退格相当容易。

HRESULT hr = CoCreateInstance(CLSID_CUIAutomation, NULL,
    CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&uiAutomation_));
    ATLENSURE_SUCCEEDED(hr);

然后

CONTROLTYPEID controlTypeID;
IUIAutomationElement * focusedElement;
if (SUCCEEDED(uiAutomation_->GetFocusedElement(&focusedElement)))
{
    focusedElement->get_CurrentControlType(&controlTypeID);
}

return controlTypeID == UIA_PaneControlTypeId ||
    controlTypeID == UIA_ListItemControlTypeId ||
    controlTypeID == UIA_DataItemControlTypeId ||
    controlTypeID == UIA_TextControlTypeId ||
    controlTypeID == UIA_ButtonControlTypeId;