目前多数移动操作系统IOS, android,还有windows10系统也可以做到当光标落到文本输入框上时,自动弹出虚拟键盘。
很多自助设备上现在都采用HTML展示UI交互,大多数使用IE核或控件进行二次开发。那我们如何可以做到我们自已的输入法(拼音,手写,只要是第三方或自已定义的输入方法)可以准确的写入到焦点对像上呢?
通过IE控件我们是有办法获取WEB上的事件的,比如说光标位置,单双击事件等等,那么通过这个事件,我们就可以得到当前是不是有输入框被选中为焦点,如果是,我们就可以读取或修改他的值(内容)了。
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONUP)
{
LPPOINT lpoint = new tagPOINT;
::GetCaretPos(lpoint);//得到光标位置
IHTMLDocument2* pDoc = (IHTMLDocument2*)GetHtmlDocument();
if (pDoc)
{
IHTMLElement * pElem = NULL;
pDoc->elementFromPoint(lpoint->x, lpoint->y, &pElem);
if (pElem)
{
BSTR bstrSrc;
VARIANT_BOOL * val = new VARIANT_BOOL;
*val = VARIANT_TRUE;
HRESULT ret = pElem->get_isTextEdit(val);
//pElem->get_className
pElem->get_innerText(&bstrSrc);
if (ret == S_OK && * val == VARIANT_TRUE)
{
CString temp = bstrSrc;
AfxMessageBox(temp);
//pElem->put_innerText(_T("............"));
//AfxMessageBox(_T("click"));
delete lpoint;
delete val;
return FALSE;
}
delete lpoint;
delete val;
//HRESULT hr = S_OK;
//IHTMLElement *pBodyElement;
//hr = pDoc->get_body(&pBodyElement);
//if (pBodyElement != NULL)
//{
// CString cs = _T("hellogirl");
// BSTR pbBody = cs.AllocSysString();
// hr = pBodyElement->put_innerHTML(pbBody); //类似的还有put_innerTEXT
// pBodyElement->Release();
//}
//pDoc->Release();
//if (hr == S_FALSE) return FALSE;
//else return TRUE;
}
}
}
if (WM_KEYDOWN == pMsg->message || WM_CHAR == pMsg->message || WM_KEYUP == pMsg->message)
{
LPPOINT lpoint = new tagPOINT;
::GetCaretPos(lpoint);//得到光标位置
IHTMLDocument2* pDoc = (IHTMLDocument2*)GetHtmlDocument();
if (pDoc)
{
IHTMLElement * pElem = NULL;
pDoc->elementFromPoint(lpoint->x, lpoint->y, &pElem);
if (pElem)
{
VARIANT_BOOL * val = new VARIANT_BOOL;
*val = VARIANT_TRUE;
HRESULT ret = pElem->get_isTextEdit(val);
if (ret == S_OK && * val == VARIANT_TRUE)
{
//AfxMessageBox(_T("abc"));
delete lpoint;
delete val;
return FALSE;
}
delete lpoint;
delete val;
}
}
}
return CHtmlView::PreTranslateMessage(pMsg);
}