Vc动态切换IE9标签(选项卡)

来源:互联网 发布:业务员提成软件 编辑:程序博客网 时间:2024/06/16 04:01

//相关头文件 Add 1210
#include <winuser.h>
#include <oleacc.h>
#pragma comment(lib,"oleacc.lib")

//全局变量 Add 1210
HWND hWndMainWindow;
IAccessible *paccMainWindow = NULL;
IAccessible *paccChildWindow = NULL;
HRESULT hr;

IAccessible*    paccControl = NULL;//输入框的 IAccessible 接口
VARIANT        varControl;            //子ID

 

 

BOOL CActiveTabDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 CoInitialize(NULL);//初始化com Add1210

}

 

void CActiveTabDlg::OnGotofirstTab()
{

 hWndMainWindow = ::FindWindow(L"IEFrame", NULL);

 if(!hWndMainWindow)   
 {
  MessageBox(L"没有发现IE窗口");
 }

 else
 {  

  //查找DirectUIHWND窗口---begin
  HWND hWnd = ::FindWindowEx(hWndMainWindow, NULL, L"WorkerW", NULL);
  if (hWnd)
   hWnd = ::FindWindowEx(hWnd, NULL, L"ReBarWindow32", NULL);
  else
   hWnd = NULL;

  if (hWnd)
   hWnd = ::FindWindowEx(hWnd, NULL, L"TabBandClass", NULL);
  else
   hWnd = NULL;

  if (hWnd)
   hWnd = ::FindWindowEx(hWnd, NULL, L"DirectUIHWND", NULL);
  //查找DirectUIHWND窗口---end

  if (hWnd)
  {
   HWND hWndChildWindow = hWnd;   
   if(S_OK == (hr = AccessibleObjectFromWindow(hWndChildWindow,OBJID_CLIENT, IID_IAccessible,(void**)&paccMainWindow)))
   {
    long nChildCount = 0;
    long nObjectCount = 0;
    HRESULT hr = paccMainWindow->get_accChildCount(&nChildCount);
    if (SUCCEEDED(hr))
    {
     VARIANT ChildStruct[50];
     HRESULT hRes=AccessibleChildren(paccMainWindow, 0, nChildCount, ChildStruct, &nObjectCount);

     for(int i = 0; i < nObjectCount; i++)   //   enum   objects
     {
      if(ChildStruct[i].vt == VT_DISPATCH)
      {
       VARIANT vtChild = ChildStruct[i];
       IDispatch* pDisp = vtChild.pdispVal;
       IAccessible* pChild = NULL;

       long nChildCount2 = 0;
       long nObjectCount2 = 0;
       VARIANT ChildStruct2[50];

       hr = pDisp->QueryInterface(IID_IAccessible, (void**) &pChild);
       if (hr == S_OK)
       {
        ///////////////////////////////////////////////////
        //这里得到tab的标签个数
        hr = pChild->get_accChildCount(&nChildCount2);
        ///////////////////////////////////////////////////

        HRESULT hRes=AccessibleChildren(pChild, 0, nChildCount2, ChildStruct2, &nObjectCount2);
        for(int j = 0; j < nObjectCount2; j++)   //   enum   objects
        {
         if(ChildStruct2[j].vt == VT_DISPATCH)
         {
          VARIANT vtChild2 = ChildStruct2[j];
          IDispatch* pDisp2 = vtChild2.pdispVal;
          IAccessible* pChild2 = NULL;
          hr = pDisp2->QueryInterface(IID_IAccessible, (void**) &pChild2);
          if (hr == S_OK)
          {
           if (j == 0) //第一个标签
           {
            VARIANT varChild;
            VariantInit(&varChild); //初始化变量
            varChild.vt = VT_I4;
            varChild.lVal = CHILDID_SELF;

            HRESULT hr = pChild2->accDoDefaultAction(varChild); //这里不成功,不知道为什么
            if (hr == S_OK)
            {
            }
           }

           //PrintName(pChild2, CHILDID_SELF);
           pChild2->Release();
           pDisp2->Release();
          }
         }
        }
        pChild->Release();
       }
       pDisp->Release();

      }
     }
    }

    paccMainWindow->Release();
   }
  }
 }
}