IE浏览器控件页面如何在选中的文本框输入焦点输入文字

本文介绍了如何在使用IE浏览器控件的系统上,当焦点落在文本输入框时,利用自定义输入法(如拼音、手写等)输入文字。通过监听WM_LBUTTONUP事件,获取当前激活元素并判断是否为文本输入框,对不同类型(如INPUT[type='text']或TEXTAREA)的输入框进行读写操作,实现了自定义输入法与HTML页面的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    目前多数移动操作系统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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值