VC/C++/MFC 獲取IE瀏覽器的滾動條位置

嘗試過各種常規方法去獲取,都獲取不到,到最後使用JS進行獲取了.同時,也提供了一種在VC/C++/MFC下執行網頁JS代碼的方法.話不多說,看代碼:

1 加入頭文件:

  1. #import "C:\\windows\\system32\\msscript.ocx" 
  2. using namespace MSScriptControl; 

2 代碼實現

  1. CString runJS(IHTMLDocument2* pDoc) 
  2.     //使用前已經初始化com 
  3.     ::CoInitialize(NULL); 
  4.     HRESULT hr; 
  5.     IScriptControlPtr pScriptControl(__uuidof(ScriptControl)); 
  6.     pScriptControl->Language = "JScript"
  7.     pScriptControl->AllowUI = TRUE; 
  8.     CString jsStr = _T("function getScroll()\ 
  9.                        {var t, l, w, h;\ 
  10.                        if (document.documentElement && document.documentElement.scrollTop)\ 
  11.                        {\ 
  12.                        t = document.documentElement.scrollTop;\ 
  13.                        l = document.documentElement.scrollLeft;\ 
  14.                        } \ 
  15.                        else if (document.body)\ 
  16.                        { \ 
  17.                        t = document.body.scrollTop;\ 
  18.                        l = document.body.scrollLeft;\ 
  19.                        } \ 
  20.                        return l+\"|\"+t;\ 
  21.                        }    "); 
  22.  
  23.     LPSAFEARRAY psa; 
  24.     SAFEARRAYBOUND rgsabound[] = { 1, 0 }; // 1 elements, 0-based 
  25.     int i; 
  26.     psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound); 
  27.     if (!psa) 
  28.     { 
  29.         return NULL; 
  30.     } 
  31.     VARIANT vFlavors[1]; 
  32.     for (i = 0; i < 1; i++) 
  33.     { 
  34.         VariantInit(&vFlavors[i]); 
  35.         V_VT(&vFlavors[i]) = VT_BSTR; 
  36.     } 
  37.     V_BSTR(&vFlavors[0]) = SysAllocString(L"TC_P"); 
  38.     long lZero = 0; 
  39.     hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]); 
  40.     for(i=0;i<1;i++) 
  41.     { 
  42.         SysFreeString(vFlavors[i].bstrVal); 
  43.     } 
  44.  
  45.     _bstr_t exp = jsStr; 
  46.     pScriptControl->AddCode(exp); 
  47.     IHTMLDocument2 *objDocument1=NULL; 
  48.     IHTMLWindow2* pIHTMLWindow1 = NULL; 
  49.     objDocument1 = pDoc; 
  50.     if(objDocument1) 
  51.     { 
  52.         objDocument1->get_parentWindow(&pIHTMLWindow1); 
  53.         pScriptControl->AddObject("window", pIHTMLWindow1, VARIANT_TRUE); 
  54.     } 
  55.     _variant_t outpar = pScriptControl->Run("getScroll", &psa); 
  56.     outpar.ChangeType(VT_BSTR,NULL); 
  57.     SafeArrayDestroy(psa); 
  58.     ::CoUninitialize(); 
  59.     return outpar.bstrVal; 

通過這個方法,就可以滾動條的位置了.至於 IHTMLDocument2* pDoc這個對象,獲取方法有很多種,下次我再發獲取IHTMLDocument2* 的代碼.

 

如果大家還有什麼更好的方法,謝謝一起交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章