IE瀏覽器控制元件頁面如何在選中的文字框輸入焦點輸入文字
目前多數移動作業系統IOS, android,還有windows10系統也可以做到當游標落到文字輸入框上時,自動彈出虛擬鍵盤。
很多自助裝置上現在都採用HTML展示UI互動,大多數使用IE核或控制元件進行二次開發。那我們如何可以做到我們自已的輸入法(拼音,手寫,只要是第三方或自已定義的輸入方法)可以準確的寫入到焦點對像上呢?
通過IE控制元件我們是有辦法獲取WEB上的事件的,比如說游標位置,單雙擊事件等等,那麼通過這個事件,我們就可以得到當前是不是有輸入框被選中為焦點,如果是,我們就可以讀取或修改他的值(內容)了。
以下是操作思路:
1、在PreTranslateMessage WM_LBUTTONUP 事件後 通過 get_activeElement 獲取當前被啟用的焦點元素
2、用 get_isTextEdit,判斷是不是我們感興趣的輸入文字框
3、判斷元素的型別,getAttribute。對於INPUT 的 TYPE進行二次判斷,只有TYPE="text“ 的我們才感興趣。
4、對他們進行讀寫操作,就這樣了。
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONUP)
{
IHTMLDocument2* pDoc = (IHTMLDocument2*)GetHtmlDocument();
if (pDoc)
{
IHTMLElement * pElem = NULL;
IHTMLElementCollection * pCollection=NULL;
HRESULT hr;
IDispatch* pHtmlDocDispatch = NULL;
VARIANT_BOOL vIsTextEdit = VARIANT_FALSE;
hr = pDoc->get_activeElement(&pElem);
pElem->get_isTextEdit(&vIsTextEdit);
if (vIsTextEdit == VARIANT_TRUE)
{
BSTR bTagName;
pElem->get_tagName(&bTagName);
CString m_TagName;
m_TagName = bTagName;
COleVariant *var2=new COleVariant();
pElem->getAttribute(_T("TYPE"), 0, var2);
if(m_TagName ==_T("INPUT"))
{
CString A = V_BSTRT(var2);
if (A == _T("text"))
{
AfxMessageBox(_T("<input type=\"text\">"));
}
}
if (m_TagName == _T("TEXTAREA"))
{
AfxMessageBox(_T("<TEXTAREA 多行文字>"));
}
return true;
}
if (pElem)
{
BSTR bstrSrc;
VARIANT_BOOL * val = new VARIANT_BOOL;
*val = VARIANT_TRUE;
HRESULT ret = pElem->get_isTextEdit(val);
hr=pElem->get_innerText(&bstrSrc);
/*
if (SUCCEEDED(hr))
{
AfxMessageBox(_T("get_innerText ok"));
}*/
if (ret == S_OK && * val == VARIANT_TRUE)
{
CString temp = bstrSrc;
CInputDlg myDlg;
myDlg.m_Content_v = temp;
if (myDlg.DoModal())
{
CComBSTR cbsName1 = myDlg.m_Content_v;
pElem->put_innerText(cbsName1);
cbsName1 = "";
}
pElem->Release();
delete val;
//AfxMessageBox(_T("ok"));
return FALSE;
}
}
}
}
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);
}