通过 IAccessiable 接口操作非窗口类控件DirectUI 数据

本文介绍如何利用Active Accessibility API实现对Windows界面元素的搜索和操作,包括获取元素状态、名称、角色等属性,以及如何通过递归查找特定元素。

// IAccessibleAply.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<tchar.h>
#include <windows.h>
#include <oleacc.h>
#include <stdio.h>
#include <comutil.h>
#include <Shlwapi.h>
#include <string>
#include <commctrl.h>  
//#include<initguid.h>///As with any COM interface, the system file initguid.h should be included in any source code that requires Active Accessibility.
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "oleacc.lib")
#pragma comment(lib, "comsuppw.lib")
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib,"kernel32.lib")
//
#include "comutil.h"  
#pragma comment(lib, "comsuppw.lib")  
#pragma comment(lib,"comsuppwd.lib")  

 
UINT GetObjectState(IAccessible* pacc, VARIANT* pvarChild, LPTSTR lpszState, UINT cchState)
{
  HRESULT hr;
  VARIANT varRetVal;
  *lpszState = 0;
  VariantInit(&varRetVal);
  hr = pacc->get_accState(*pvarChild, &varRetVal);
  if (!SUCCEEDED(hr))
    return(0);
  if (varRetVal.vt == VT_I4)
  {
    // 根据返回的状态值生成以逗号连接的字符串。
    GetStateText(varRetVal.lVal, lpszState, cchState);
  }
  else if (varRetVal.vt == VT_BSTR)
  {
    if (varRetVal.bstrVal)_tcscpy_s(lpszState, cchState, _com_util::ConvertBSTRToString(varRetVal.bstrVal));
  }
  VariantClear(&varRetVal);
  return _tcslen(lpszState);
}

UINT GetObjectName(IAccessible* pacc, VARIANT* pvarChild, LPTSTR lpszName, UINT cchName)
{
  HRESULT hr;
  BSTR pszName;
  hr = pacc->get_accName(*pvarChild, &pszName);
  if (pszName)_tcscpy_s(lpszName, cchName, _com_util::ConvertBSTRToString(pszName));
  return _tcslen(lpszName);
}

UINT GetObjectValue(IAccessible* pacc, VARIANT* pvarChild, TCHAR* pValue, UINT cchValue)
{
  HRESULT hr;
  BSTR pszValue;
  hr = pacc->get_accValue(*pvarChild, &pszValue);
  if (pszValue)_tcscpy_s(pValue, cchValue, _com_util::ConvertBSTRToString(pszValue));
  return _tcslen(pValue);
}

UINT GetObjectClass(IAccessible* paccChild, LPTSTR lpszClass, UINT cchClass)
{
  HWND hWnd;
  ::WindowFromAccessibleObject(p

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值