基本信息
源码名称:WinACC测试
源码大小:5.13KB
文件格式:.zip
开发语言:C/C++
更新时间:2021-04-16
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include <oleacc.h>
#include <atlcomcli.h>
#pragma comment(lib, "Oleacc.lib")
BOOL Init(HWND hWnd, CComQIPtr<IAccessible, &IID_IAccessible>& ppAcc)
{
HRESULT hr = AccessibleObjectFromWindow(hWnd, OBJID_WINDOW, IID_IAccessible, (void**)&ppAcc);
if (hr != S_OK)
return FALSE;
return TRUE;
}
UINT GetObjectState(IAccessible* pacc,
VARIANT* pvarChild,
LPSTR lpszState,
UINT cchState)
{
HRESULT hr;
VARIANT varRetVal;
*lpszState = 0;
VariantInit(&varRetVal);
hr = pacc->get_accState(*pvarChild, &varRetVal);
if (!SUCCEEDED(hr))
return(0);
DWORD dwStateBit;
int cChars = 0;
if (varRetVal.vt == VT_I4)
{
// 根据返回的状态值生成以逗号连接的字符串。
for (dwStateBit = STATE_SYSTEM_UNAVAILABLE;
dwStateBit < STATE_SYSTEM_ALERT_HIGH;
dwStateBit <<= 1)
{
if (varRetVal.lVal & dwStateBit)
{
cChars = GetStateTextA(dwStateBit,
lpszState cChars,
cchState - cChars);
*(lpszState cChars ) = ',';
}
}
if(cChars > 1)
*(lpszState cChars - 1) = '\0';
}
else if (varRetVal.vt == VT_BSTR)
{
WideCharToMultiByte(CP_ACP,
0,
varRetVal.bstrVal,
-1,
lpszState,
cchState,
NULL,
NULL);
}
VariantClear(&varRetVal);
return(strlen(lpszState));
}
void GetObjectName(
IAccessible* child,
VARIANT* varChild,
char* objName,
int len)
{
BSTR strTmp;
HRESULT hr = child->get_accName(*varChild, &strTmp);
if(S_OK!=hr) {
return;
}
//_bstr_t str = strTmp;
//wchar_t* tmp = str;
wchar_t* tmp = strTmp;
WideCharToMultiByte(CP_ACP,
0,
tmp,
-1,
objName,
len,
NULL,
NULL);
}
void GetObjectRole(
IAccessible* child,
VARIANT* varChild,
char* objRole,
int len)
{
VARIANT pvarRole;
DWORD roleId;
child->get_accRole(*varChild,&pvarRole);
if(varChild->vt!=VT_I4) {
pvarRole.vt = VT_EMPTY;
return /*E_INVALIDARG*/;
}
roleId = pvarRole.lVal;
UINT roleLength;
LPTSTR lpszRoleString;
// Get the length of the string.
roleLength = GetRoleText(roleId,NULL,0);
// Allocate memory for the string. Add one character to
// the length you got in the previous call to make room
// for the null character.
lpszRoleString = (LPTSTR)malloc((roleLength 1) * sizeof(TCHAR));
if(lpszRoleString!=NULL) {
// Get the string.
GetRoleText(roleId,lpszRoleString,roleLength 1);
}
wchar_t* tmp = lpszRoleString;
WideCharToMultiByte(CP_ACP,
0,
tmp,
-1,
objRole,
len,
NULL,
NULL);
free(lpszRoleString);
return /*S_OK*/;
}
void GetObjectClass(IAccessible* child,char* objClass,int len) {
HWND htmp;
LPTSTR strClass;
strClass = (LPTSTR)malloc(MAX_PATH);
::WindowFromAccessibleObject(child,&htmp);
if(0==::GetClassName(htmp,strClass,MAX_PATH)) {
free(strClass);
return;
}
wchar_t* tmp = strClass;
WideCharToMultiByte(CP_ACP,
0,
tmp,
-1,
objClass,
len,
NULL,
NULL);
free(strClass);
}
BOOL FindChild (IAccessible* paccParent,
LPSTR szName, LPSTR szRole,
LPSTR szClass,
IAccessible** paccChild,
VARIANT* pvarChild)
{
HRESULT hr;
long numChildren;
unsigned long numFetched;
VARIANT varChild;
int index;
IAccessible* pCAcc = NULL;
IEnumVARIANT* pEnum = NULL;
IDispatch* pDisp = NULL;
BOOL found = false;
char szObjName[256], szObjRole[256], szObjClass[256], szObjState[256];
//得到父亲支持的IEnumVARIANT接口
hr = paccParent -> QueryInterface(IID_IEnumVARIANT, (PVOID*) & pEnum);
if(pEnum)
pEnum -> Reset();
//取得父亲拥有的可访问的子的数目
paccParent -> get_accChildCount(&numChildren);
//搜索并比较每一个子ID,找到名字、角色、类与输入相一致的。
for(index = 1; index <= numChildren && !found; index )
{
pCAcc = NULL;
// 如果支持IEnumVARIANT接口,得到下一个子ID
//以及其对应的 IDispatch 接口
if (pEnum)
hr = pEnum -> Next(1, &varChild, &numFetched);
else
{
//如果一个父亲不支持IEnumVARIANT接口,子ID就是它的序号
varChild.vt = VT_I4;
varChild.lVal = index;
}
// 找到此子ID对应的 IDispatch 接口
if (varChild.vt == VT_I4)
{
//通过子ID序号得到对应的 IDispatch 接口
pDisp = NULL;
hr = paccParent -> get_accChild(varChild, &pDisp);
}
else
//如果父支持IEnumVARIANT接口可以直接得到子IDispatch 接口
pDisp = varChild.pdispVal;
// 通过 IDispatch 接口得到子的 IAccessible 接口 pCAcc
if (pDisp)
{
hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pCAcc);
hr = pDisp->Release();
}
// Get information about the child
if(pCAcc)
{
//如果子支持IAccessible 接口,那么子ID就是CHILDID_SELF
VariantInit(&varChild);
varChild.vt = VT_I4;
varChild.lVal = CHILDID_SELF;
*paccChild = pCAcc;
}
else
//如果子不支持IAccessible 接口
*paccChild = paccParent;
//跳过了有不可访问状态的元素
GetObjectState(*paccChild,
&varChild,
szObjState,
sizeof(szObjState));
if(NULL != strstr(szObjState, "unavailable"))
{
if(pCAcc)
pCAcc->Release();
continue;
}
//通过get_accName得到Name
GetObjectName(*paccChild, &varChild, szObjName, sizeof(szObjName));
//通过get_accRole得到Role
GetObjectRole(*paccChild, &varChild, szObjRole, sizeof(szObjRole));
//通过WindowFromAccessibleObject和GetClassName得到Class
GetObjectClass(*paccChild, szObjClass, sizeof(szObjClass));
//以上实现代码比较简单,大家自己看代码吧。
//如果这些参数与输入相符或输入为NULL
if ((!szName ||
!strcmp(szName, szObjName)) &&
(!szRole ||
!strcmp(szRole, szObjRole)) &&
(!szClass ||
!strcmp(szClass, szObjClass)))
{
found = true;
*pvarChild = varChild;
break;
}
if(!found && pCAcc)
{
// 以这次得到的子接口为父递归调用
found = FindChild(pCAcc,
szName,
szRole,
szClass,
paccChild,
pvarChild);
if(*paccChild != pCAcc)
pCAcc->Release();
}
}//End for
// Clean up
if(pEnum)
pEnum -> Release();
return found;
}
void EnumWechat()
{
// 获取微信窗口
HWND hWnd = FindWindow(TEXT("WeChatMainWndForPC"), TEXT("微信"));
// 转成ACC接口
CComQIPtr<IAccessible,&IID_IAccessible> m_pAcc;
if( !Init(hWnd, m_pAcc) )
{
printf("打开失败!\n");
return ;
}
// 获取控件
VARIANT varControl;
IAccessible* paccControl = NULL;
if( FindChild(m_pAcc,
"聊天",
"按下按钮",
NULL,
&paccControl,
&varControl) )
{
printf("找到控件!\n");
// 操作控件
HRESULT hr = paccControl->accDoDefaultAction(varControl);
// 发送事件
long pxLeft = 0;
long pyTop = 0;
long pcxWidth = 0;
long pcyHeight = 0;
if (S_OK == paccControl->accLocation(&pxLeft, &pyTop, &pcxWidth, &pcyHeight, varControl)) // 获取到坐标 是全局坐标
{
printf("%u\n", pxLeft);
HDC hdc = GetDC(GetDesktopWindow());
// 在控件上画个矩形
HPEN hPen = CreatePen(PS_SOLID,0,RGB(255,0,0));
HBRUSH hBrush = CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc, hPen);
SelectObject(hdc, hBrush);
Ellipse(hdc, pxLeft, pyTop, pxLeft pcxWidth, pyTop pcyHeight);
ReleaseDC(GetDesktopWindow(), hdc);
// 点击聊天
RECT rect = {0};
GetWindowRect(hWnd, &rect);
int xpoint, ypoint;
xpoint = pxLeft-rect.left pcxWidth/2;
ypoint = pyTop-rect.top pcyHeight/2;
printf("坐标(%u, %u)\n", xpoint, ypoint);
SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(xpoint, ypoint));
SendMessage(hWnd, WM_LBUTTONUP, 0, MAKELONG(xpoint, ypoint));
Sleep(800);
// 切换到联系人
ypoint = pcyHeight;
SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(xpoint, ypoint));
SendMessage(hWnd, WM_LBUTTONUP, 0, MAKELONG(xpoint, ypoint));
}
paccControl->Release();
VariantClear(&varControl);
}
}
INT _tmain(INT argc, TCHAR **argv)
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
EnumWechat();
CoUninitialize();
return 0;
}