Active Accessibility

来源:互联网 发布:手机淘宝如何快速抢购 编辑:程序博客网 时间:2024/05/21 21:12

 CString strRole;
 GetRoleText(ROLE_SYSTEM_TEXT, strRole.GetBuffer(256), 256);
 strRole.ReleaseBuffer();

 // TODO: Add your control notification handler code here
 CString strWndValue;
 GetDlgItemText(IDC_EDIT_HWND, strWndValue);
 HWND hWnd =  (HWND)ssTtoi(strWndValue);
 if(!::IsWindow(hWnd))
 {
  AfxMessageBox(TEXT("IsWindow return false"));
  return;
 }

 CComPtr<IAccessible> spMainWnd;
 if(AccessibleObjectFromWindow(hWnd, OBJID_WINDOW, IID_IAccessible, (void**)&spMainWnd) != S_OK)
 {
  return;
 }

 FILE *pFile = _tfopen(TEXT("d://active accessiblity aly.txt"), TEXT("w+"));
 EnumChild(spMainWnd, EnumChildCB, (LPVOID)pFile);
 fclose(pFile);

 

////////////////////////


#include <OleAcc.h>
#pragma comment( lib, "Oleacc.lib")
#define STATE_IS_SET(a, s) ( ((a)&(s)) == (s) )

void GetRoleString(UINT uRole, CString &strRole)
{
 strRole.Empty();
 if(STATE_IS_SET(uRole, ROLE_SYSTEM_TITLEBAR))
 {
  strRole += TEXT("ROLE_SYSTEM_TITLEBAR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_MENUBAR))
 {
  strRole += TEXT(",ROLE_SYSTEM_MENUBAR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SCROLLBAR))
 {
  strRole += TEXT(",ROLE_SYSTEM_SCROLLBAR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_GRIP))
 {
  strRole += TEXT(",ROLE_SYSTEM_GRIP");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SOUND))
 {
  strRole += TEXT(",ROLE_SYSTEM_SOUND");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CURSOR))
 {
  strRole += TEXT(",ROLE_SYSTEM_CURSOR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CARET))
 {
  strRole += TEXT(",ROLE_SYSTEM_CARET");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_ALERT))
 {
  strRole += TEXT(",ROLE_SYSTEM_ALERT");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_WINDOW))
 {
  strRole += TEXT(",ROLE_SYSTEM_WINDOW");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CLIENT))
 {
  strRole += TEXT(",ROLE_SYSTEM_CLIENT");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_MENUPOPUP))
 {
  strRole += TEXT(",ROLE_SYSTEM_MENUPOPUP");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_MENUITEM))
 {
  strRole += TEXT(",ROLE_SYSTEM_MENUITEM");
 }


 if(STATE_IS_SET(uRole, ROLE_SYSTEM_TOOLTIP))
 {
  strRole += TEXT(",ROLE_SYSTEM_TOOLTIP");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_APPLICATION))
 {
  strRole += TEXT(",ROLE_SYSTEM_APPLICATION");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_DOCUMENT))
 {
  strRole += TEXT(",ROLE_SYSTEM_DOCUMENT");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PANE))
 {
  strRole += TEXT(",ROLE_SYSTEM_PANE");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CHART))
 {
  strRole += TEXT(",ROLE_SYSTEM_CHART");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_DIALOG))
 {
  strRole += TEXT(",ROLE_SYSTEM_DIALOG");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_BORDER))
 {
  strRole += TEXT(",ROLE_SYSTEM_BORDER");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_GROUPING))
 {
  strRole += TEXT(",ROLE_SYSTEM_GROUPING");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SEPARATOR))
 {
  strRole += TEXT(",ROLE_SYSTEM_SEPARATOR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_TOOLBAR))
 {
  strRole += TEXT(",ROLE_SYSTEM_TOOLBAR");
 }


 if(STATE_IS_SET(uRole, ROLE_SYSTEM_STATUSBAR))
 {
  strRole += TEXT(",ROLE_SYSTEM_STATUSBAR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_TABLE))
 {
  strRole += TEXT(",ROLE_SYSTEM_TABLE");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_COLUMNHEADER))
 {
  strRole += TEXT(",ROLE_SYSTEM_COLUMNHEADER");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_ROWHEADER))
 {
  strRole += TEXT(",ROLE_SYSTEM_ROWHEADER");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_COLUMN))
 {
  strRole += TEXT(",ROLE_SYSTEM_COLUMN");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_ROW))
 {
  strRole += TEXT(",ROLE_SYSTEM_ROW");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CELL))
 {
  strRole += TEXT(",ROLE_SYSTEM_CELL");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_LINK))
 {
  strRole += TEXT(",ROLE_SYSTEM_LINK");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_HELPBALLOON))
 {
  strRole += TEXT(",ROLE_SYSTEM_HELPBALLOON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CHARACTER))
 {
  strRole += TEXT(",ROLE_SYSTEM_CHARACTER");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_LIST))
 {
  strRole += TEXT(",ROLE_SYSTEM_LIST");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_LISTITEM))
 {
  strRole += TEXT(",ROLE_SYSTEM_LISTITEM");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_OUTLINE))
 {
  strRole += TEXT(",ROLE_SYSTEM_OUTLINE");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_OUTLINEITEM))
 {
  strRole += TEXT(",ROLE_SYSTEM_OUTLINEITEM");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PAGETAB))
 {
  strRole += TEXT(",ROLE_SYSTEM_PAGETAB");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PROPERTYPAGE))
 {
  strRole += TEXT(",ROLE_SYSTEM_PROPERTYPAGE");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_INDICATOR))
 {
  strRole += TEXT(",ROLE_SYSTEM_INDICATOR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_GRAPHIC))
 {
  strRole += TEXT(",ROLE_SYSTEM_GRAPHIC");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_STATICTEXT))
 {
  strRole += TEXT(",ROLE_SYSTEM_STATICTEXT");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_TEXT))
 {
  strRole += TEXT(",ROLE_SYSTEM_TEXT");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PUSHBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_PUSHBUTTON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CHECKBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_CHECKBUTTON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_RADIOBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_RADIOBUTTON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_COMBOBOX))
 {
  strRole += TEXT(",ROLE_SYSTEM_COMBOBOX");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_DROPLIST))
 {
  strRole += TEXT(",ROLE_SYSTEM_DROPLIST");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PROGRESSBAR))
 {
  strRole += TEXT(",ROLE_SYSTEM_PROGRESSBAR");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_DIAL))
 {
  strRole += TEXT(",ROLE_SYSTEM_DIAL");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_HOTKEYFIELD))
 {
  strRole += TEXT(",ROLE_SYSTEM_HOTKEYFIELD");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SLIDER))
 {
  strRole += TEXT(",ROLE_SYSTEM_SLIDER");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SPINBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_SPINBUTTON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_DIAGRAM))
 {
  strRole += TEXT(",ROLE_SYSTEM_DIAGRAM");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_ANIMATION))
 {
  strRole += TEXT(",ROLE_SYSTEM_ANIMATION");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_EQUATION))
 {
  strRole += TEXT(",ROLE_SYSTEM_EQUATION");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_BUTTONDROPDOWN))
 {
  strRole += TEXT(",ROLE_SYSTEM_BUTTONDROPDOWN");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_BUTTONMENU))
 {
  strRole += TEXT(",ROLE_SYSTEM_BUTTONMENU");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_BUTTONDROPDOWNGRID))
 {
  strRole += TEXT(",ROLE_SYSTEM_BUTTONDROPDOWNGRID");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_WHITESPACE))
 {
  strRole += TEXT(",ROLE_SYSTEM_WHITESPACE");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_PAGETABLIST))
 {
  strRole += TEXT(",ROLE_SYSTEM_PAGETABLIST");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_CLOCK))
 {
  strRole += TEXT(",ROLE_SYSTEM_CLOCK");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_SPLITBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_SPLITBUTTON");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_IPADDRESS))
 {
  strRole += TEXT(",ROLE_SYSTEM_IPADDRESS");
 }

 if(STATE_IS_SET(uRole, ROLE_SYSTEM_OUTLINEBUTTON))
 {
  strRole += TEXT(",ROLE_SYSTEM_OUTLINEBUTTON");
 }

}


void GetStateString(UINT uState, CString &strState)
{
 strState.Empty();
 if(STATE_IS_SET(uState, STATE_SYSTEM_ALERT_HIGH))
 {
  strState += TEXT("STATE_SYSTEM_ALERT_HIGH");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_ALERT_MEDIUM))
 {
  strState += TEXT(",STATE_SYSTEM_ALERT_MEDIUM");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_ALERT_LOW))
 {
  strState += TEXT(",STATE_SYSTEM_ALERT_LOW");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_ANIMATED))
 {
  strState += TEXT(",STATE_SYSTEM_ANIMATED");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_BUSY))
 {
  strState += TEXT(",STATE_SYSTEM_BUSY");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_CHECKED))
 {
  strState += TEXT(",STATE_SYSTEM_CHECKED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_COLLAPSED))
 {
  strState += TEXT(",STATE_SYSTEM_COLLAPSED");
 }

 if(STATE_IS_SET(uState, STATE_SYSTEM_DEFAULT))
 {
  strState += TEXT(",STATE_SYSTEM_DEFAULT");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_EXPANDED))
 {
  strState += TEXT(",STATE_SYSTEM_EXPANDED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_EXTSELECTABLE))
 {
  strState += TEXT(",STATE_SYSTEM_EXTSELECTABLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_FLOATING))
 {
  strState += TEXT(",STATE_SYSTEM_FLOATING");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_FOCUSABLE))
 {
  strState += TEXT(",STATE_SYSTEM_FOCUSABLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_FOCUSED))
 {
  strState += TEXT(",STATE_SYSTEM_FOCUSED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_HASPOPUP))
 {
  strState += TEXT(",STATE_SYSTEM_HASPOPUP");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_HOTTRACKED))
 {
  strState += TEXT(",STATE_SYSTEM_HOTTRACKED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_INVISIBLE))
 {
  strState += TEXT(",STATE_SYSTEM_INVISIBLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_LINKED))
 {
  strState += TEXT(",STATE_SYSTEM_LINKED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_MARQUEED))
 {
  strState += TEXT(",STATE_SYSTEM_MARQUEED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_MIXED))
 {
  strState += TEXT(",STATE_SYSTEM_MIXED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_MOVEABLE))
 {
  strState += TEXT(",STATE_SYSTEM_MOVEABLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_MULTISELECTABLE))
 {
  strState += TEXT(",STATE_SYSTEM_MULTISELECTABLE");
 }
/*
 if(STATE_IS_SET(uState, STATE_SYSTEM_NORMAL))
 {
  strState += TEXT(",STATE_SYSTEM_NORMAL");
 }
*/
 if(STATE_IS_SET(uState, STATE_SYSTEM_OFFSCREEN))
 {
  strState += TEXT(",STATE_SYSTEM_OFFSCREEN");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_PRESSED))
 {
  strState += TEXT(",STATE_SYSTEM_PRESSED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_PROTECTED))
 {
  strState += TEXT(",STATE_SYSTEM_PROTECTED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_READONLY))
 {
  strState += TEXT(",STATE_SYSTEM_READONLY");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_SELECTABLE))
 {
  strState += TEXT(",STATE_SYSTEM_SELECTABLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_SELECTED))
 {
  strState += TEXT(",STATE_SYSTEM_SELECTED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_SELFVOICING))
 {
  strState += TEXT(",STATE_SYSTEM_SELFVOICING");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_SIZEABLE))
 {
  strState += TEXT(",STATE_SYSTEM_SIZEABLE");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_TRAVERSED))
 {
  strState += TEXT(",STATE_SYSTEM_TRAVERSED");
 }
 if(STATE_IS_SET(uState, STATE_SYSTEM_UNAVAILABLE))
 {
  strState += TEXT(",STATE_SYSTEM_UNAVAILABLE");
 }

}


enum EnumChildCBType{ ECT_ChildDown, ECT_ChildUp, ECT_Self};

typedef BOOL (CALLBACK *PEnumChildCB)(EnumChildCBType type, IAccessible *pAccessible, VARIANT varChild, UINT uRole, UINT uState, LPCTSTR lpClass
           , LPCTSTR lpValue, LPCTSTR lpName, LPVOID lpParam);

BOOL CALLBACK EnumChildCB(EnumChildCBType type, IAccessible *pAccessible, VARIANT varChild, UINT uRole, UINT uState, LPCTSTR lpClass
        , LPCTSTR lpValue, LPCTSTR lpName, LPVOID lpParam)
{
 static int nX = 0;
 if(type == ECT_ChildDown)
 {
  nX++;
  return TRUE;
 }

 if(type == ECT_ChildUp)
 {
  nX--;
  return TRUE;
 }

 CString lpRole;
 GetRoleString(uRole, lpRole);
 CString lpState;
 GetStateString(uRole, lpState);

 FILE *pFile = (FILE*)lpParam;
 
 static TCHAR lpBlank[500] = {0};
 static TCHAR lpText[4096] = {0};
 memset(lpBlank, 0, sizeof(lpBlank));
 int nIndex = 0;
 for (nIndex=0; nIndex<nX*2; nIndex++)
 {
  lpBlank[nIndex] = TEXT('>');
 }

 _stprintf(lpText, TEXT("%sClass=%s/r/n%sName=%s/r/n%sRole=%s/r/n%sState=%s/r/n%sValue=%s/r/n")
  , lpBlank, lpClass, lpBlank, (LPCTSTR)lpName, lpBlank, lpRole, lpBlank, lpState, lpBlank, lpValue);

 USES_CONVERSION;
 LPCSTR lpCStrText = T2A(lpText);
 fwrite(lpCStrText, sizeof(CHAR), strlen(lpCStrText), pFile);
 fflush(pFile);

 return TRUE;
}

HRESULT EnumChild(IAccessible *pAccessibleParent, PEnumChildCB pfuncCB, LPVOID lpCBParam)
{
 long lChildCount = 0;
 if(pAccessibleParent->get_accChildCount(&lChildCount) != S_OK)
 {
  return E_FAIL;
 }

 HRESULT rv = E_FAIL;

 CComQIPtr<IEnumVARIANT> spEnum = pAccessibleParent;
 if(spEnum != NULL)
 {
  spEnum->Reset();
 }

 ULONG uFetched = 0;
 int nIndex = 0;
 for (nIndex=1; nIndex<=lChildCount; nIndex++)
 {
  CComPtr<IDispatch> spChildDisp;

  CComVariant varChild;
  if(spEnum != NULL)
  {
   if(spEnum->Next(1, &varChild, &uFetched) != S_OK)
    break;
  }else{
   varChild.vt = VT_I4;
   varChild.intVal = nIndex;
  }

  if(varChild.vt == VT_I4)
  {
   pAccessibleParent->get_accChild(varChild, &spChildDisp);
  }else{
   spChildDisp = varChild.pdispVal;
  }

  CComQIPtr<IAccessible> spChild = spChildDisp;
  if(spChild == NULL)
  {
   spChild  = pAccessibleParent;
  }else{
   varChild.vt = VT_I4;
   varChild.intVal = CHILDID_SELF;
  }

  CComVariant varRole;
  if(spChild->get_accRole(varChild, &varRole) != S_OK)
  {
   continue;
  }
  if(varRole.vt != VT_I4)
  {
   continue;
  }

  UINT uState = 0;
  CComVariant varState;
  if(spChild->get_accState(varChild, &varState) != S_OK)
  {
   continue;
  }
  if(varState.vt != VT_I4)
  {
   continue;
  }
  if(STATE_IS_SET(varState.intVal, STATE_SYSTEM_INVISIBLE))
   continue;

  CString strClass;
  HWND hWnd;
  if(WindowFromAccessibleObject(spChild, &hWnd) == S_OK)
  {
   if(hWnd != NULL)
   {
    GetClassName(hWnd, strClass.GetBuffer(500), 500);
    strClass.ReleaseBuffer();
   }else{
    strClass = TEXT("No window");
   }
  }

  CComBSTR strValue;
  spChild->get_accValue(varChild, &strValue);

  CComBSTR strName;
  spChild->get_accName(varChild, &strName);

  if(pfuncCB != NULL)
  {
   if(!pfuncCB(ECT_Self,spChild, varChild, varRole.intVal, varState.intVal, strClass, strValue, strName, lpCBParam))
   {
    rv = E_ABORT;
    break;
   }
  }

  long lChildCount2 = 0;

  if(varChild.vt == VT_I4 && varChild.intVal == CHILDID_SELF && spChild->get_accChildCount(&lChildCount2) == S_OK && lChildCount2 > 0)
  {
   if(!pfuncCB(ECT_ChildDown, spChild,varChild, varRole.intVal,  varState.intVal, strClass, strValue, strName, lpCBParam))
   {
    rv = E_ABORT;
    break;
   }
   
   rv = EnumChild(spChild, pfuncCB, lpCBParam);
   if(rv != S_OK)
   {
    break;
   }
    
   if(!pfuncCB(ECT_ChildUp, spChild, varChild, varRole.intVal,  varState.intVal, strClass, strValue, strName, lpCBParam))
   {
    rv = E_ABORT;
    break;
   }

  }

 }

 return S_OK;
}

原创粉丝点击