嘗試過各種常規方法去獲取,都獲取不到,到最後使用JS進行獲取了.同時,也提供了一種在VC/C++/MFC下執行網頁JS代碼的方法.話不多說,看代碼:
1 加入頭文件:
- #import "C:\\windows\\system32\\msscript.ocx"
- using namespace MSScriptControl;
2 代碼實現
- CString runJS(IHTMLDocument2* pDoc)
- {
- //使用前已經初始化com
- ::CoInitialize(NULL);
- HRESULT hr;
- IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
- pScriptControl->Language = "JScript";
- pScriptControl->AllowUI = TRUE;
- CString jsStr = _T("function getScroll()\
- {var t, l, w, h;\
- if (document.documentElement && document.documentElement.scrollTop)\
- {\
- t = document.documentElement.scrollTop;\
- l = document.documentElement.scrollLeft;\
- } \
- else if (document.body)\
- { \
- t = document.body.scrollTop;\
- l = document.body.scrollLeft;\
- } \
- return l+\"|\"+t;\
- } ");
- LPSAFEARRAY psa;
- SAFEARRAYBOUND rgsabound[] = { 1, 0 }; // 1 elements, 0-based
- int i;
- psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
- if (!psa)
- {
- return NULL;
- }
- VARIANT vFlavors[1];
- for (i = 0; i < 1; i++)
- {
- VariantInit(&vFlavors[i]);
- V_VT(&vFlavors[i]) = VT_BSTR;
- }
- V_BSTR(&vFlavors[0]) = SysAllocString(L"TC_P");
- long lZero = 0;
- hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
- for(i=0;i<1;i++)
- {
- SysFreeString(vFlavors[i].bstrVal);
- }
- _bstr_t exp = jsStr;
- pScriptControl->AddCode(exp);
- IHTMLDocument2 *objDocument1=NULL;
- IHTMLWindow2* pIHTMLWindow1 = NULL;
- objDocument1 = pDoc;
- if(objDocument1)
- {
- objDocument1->get_parentWindow(&pIHTMLWindow1);
- pScriptControl->AddObject("window", pIHTMLWindow1, VARIANT_TRUE);
- }
- _variant_t outpar = pScriptControl->Run("getScroll", &psa);
- outpar.ChangeType(VT_BSTR,NULL);
- SafeArrayDestroy(psa);
- ::CoUninitialize();
- return outpar.bstrVal;
- }
通過這個方法,就可以滾動條的位置了.至於 IHTMLDocument2* pDoc這個對象,獲取方法有很多種,下次我再發獲取IHTMLDocument2* 的代碼.
如果大家還有什麼更好的方法,謝謝一起交流!