edge获取地址 msa-使用MSA技术获取MS Edge浏览器的输入地址,为什么win10 32位能够获取而64位无法获取?

问题描述

使用MSA技术获取MS Edge浏览器的输入地址,为什么win10 32位能够获取而64位无法获取?

#include
#pragma comment(lib, "comsuppw.lib")

#include
#include
#include
#pragma comment( lib, "Oleacc.lib")

// --------------------------------------------------------------------------
//
// GetObjectName()
//
// This gets the name of an object.
//
// --------------------------------------------------------------------------
UINT GetObjectName(IAccessible* pacc, VARIANT* pvarChild, LPTSTR lpszName, UINT cchName)
{
CString str;
HRESULT hr;
BSTR bstrName;

*lpszName = 0;
bstrName = NULL;

hr = pacc->get_accName(*pvarChild, &bstrName);

if (SUCCEEDED(hr) && bstrName)
{
    _tcsncpy_s(lpszName, MAX_PATH,bstrName, _tcslen(bstrName));
}

return(lstrlen(lpszName));

}
UINT GetObjectState(IAccessible* pacc, VARIANT* pvarChild, LPTSTR lpszState, UINT cchState)
{
CString str;
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)
{
    // Convert state flags to comma separated list.
    for (dwStateBit = STATE_SYSTEM_UNAVAILABLE; dwStateBit < STATE_SYSTEM_ALERT_HIGH; dwStateBit <<= 1)
    {
        if (varRetVal.lVal & dwStateBit)
        {
            cChars += GetStateText(dwStateBit, lpszState + cChars, cchState - cChars);
            *(lpszState + cChars++) = ',';
        }
    }
    if(cChars > 1)
        *(lpszState + cChars - 1) = '';
}
else if (varRetVal.vt == VT_BSTR)
{
    _tcsncpy_s(lpszState, MAX_PATH, varRetVal.bstrVal, _tcslen(varRetVal.bstrVal));
}

VariantClear(&varRetVal);

return(lstrlen(lpszState));

}

// --------------------------------------------------------------------------
//
// GetObjectClass()
//
// This gets the Class of an object.
//
// --------------------------------------------------------------------------
UINT GetObjectClass(IAccessible* pacc, LPTSTR lpszClass, UINT cchClass)
{
HWND hWnd;
if(S_OK == WindowFromAccessibleObject(pacc, &hWnd))
{
if(hWnd)
GetClassName(hWnd, lpszClass, cchClass);
else
_tcscpy(lpszClass, _T("No window"));
}

return 1;

}

// --------------------------------------------------------------------------
//
// GetObjectRole()
//
// --------------------------------------------------------------------------
UINT GetObjectRole(IAccessible* pacc, VARIANT* pvarChild, LPTSTR lpszRole, UINT cchRole)
{
CString str;
HRESULT hr;
VARIANT varRetVal;

*lpszRole = 0;

VariantInit(&varRetVal);

hr = pacc->get_accRole(*pvarChild, &varRetVal);

if (!SUCCEEDED(hr))
    return(0);

if (varRetVal.vt == VT_I4)
{
    //the function GetRoleText use to translate the int to the Role string.
    GetRoleText(varRetVal.lVal, lpszRole, cchRole);
}
else if (varRetVal.vt == VT_BSTR)
{
    _tcsncpy_s(lpszRole, MAX_PATH, varRetVal.bstrVal, _tcslen(varRetVal.bstrVal));
}

VariantClear(&varRetVal);

return(lstrlen(lpszRole));

}

bool EnumUIChild(IAccessible* paccParent, IAccessible** paccChild, VARIANT* pvarChild)
{
CString str;
HRESULT hr;
long numChildren = 0;
unsigned long numFetched;
VARIANT varChild;
int index;
IAccessible* pCAcc = NULL;
IEnumVARIANT* pEnum = NULL;
IDispatch* pDisp = NULL;
bool found = false;

TCHAR szObjName[MAX_PATH] = {0};
TCHAR szObjRole[MAX_PATH] = {0};
TCHAR szObjClass[MAX_PATH] = {0};
TCHAR szObjState[MAX_PATH] = {0};

//Get the IEnumVARIANT interface
hr = paccParent -> QueryInterface(IID_IEnumVARIANT, (PVOID*) & pEnum);
if(pEnum)
    pEnum -> Reset();

// Get child count
paccParent -> get_accChildCount(&numChildren);

for(index = 1; (index <= numChildren) && (found == false); index++)
{
    pCAcc = NULL;

    // Get next child
    if (pEnum)
        hr = pEnum -> Next(1, &varChild, &numFetched);
    else
    {
        //if the farther don't support IEnumVARIANT interface丆
        //ID equal index.
        varChild.vt = VT_I4;
        varChild.lVal = index;
    }

    // Get IDispatch interface for the child
    if (varChild.vt == VT_I4)
    {
        //Get Dispatch interface from ID.
        pDisp = NULL;
        hr = paccParent -> get_accChild(varChild, &pDisp);
    }
    else
        //if the farther support IEnumVARIANT interface,
        //Get the child's IDispatch interface directly.
        pDisp = varChild.pdispVal;

    // Get IAccessible interface for the child
    if (pDisp)
    {
        hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pCAcc);
        hr = pDisp->Release();
    }

    // Get information about the child
    if(pCAcc)
    {
        //if the leaf support IAccessible interface.ID equal CHILDID_SELF
        VariantInit(&varChild);
        varChild.vt = VT_I4;
        varChild.lVal = CHILDID_SELF;

        *paccChild = pCAcc;
    }
    else
        //if the leaf do not support IAccessible interface.
        *paccChild = paccParent;

    // Skip invisible and unavailable objects and their children
    GetObjectState(*paccChild, &varChild, szObjState, sizeof(szObjState));
    if(NULL != _tcsstr(szObjState, _T("unavailable")))
    {
        if(pCAcc)
            pCAcc->Release();
        continue;
    }

    GetObjectName(*paccChild, &varChild, szObjName, sizeof(szObjName));
    GetObjectRole(*paccChild, &varChild, szObjRole, sizeof(szObjRole));
    GetObjectClass(*paccChild, szObjClass, sizeof(szObjClass));

    CString strRole = szObjRole;
    CString strName = szObjName;

    if(/*(0 == strName.Compare(_T("搜索或输入网址")) && 0 == strRole.Compare(_T("可编辑文本"))) ||
        (0 == strName.Compare(_T("Address and search bar")) && 0 == strRole.Compare(_T("editable text"))) ||
        (0 == strName.Compare(_T("Address and search bar")) && 0 == strRole.Compare(_T("可编辑文本"))) ||
        (0 == strName.Compare(_T("搜索或输入网址")) && 0 == strRole.Compare(_T("editable text")))*/
        0 == strRole.Compare(_T("可编辑文本")))
    {
        found = true;
        *pvarChild = varChild;
        break;
    }
    if(!found && pCAcc)
    {
        found = EnumUIChild(pCAcc, paccChild, pvarChild);
        if(*paccChild != pCAcc)
            pCAcc->Release();

        if(found == true)
            return true;
    }
}

if(pEnum)
    pEnum -> Release();

return found;

}

CString GetURLText()
{
TCHAR szEdit[1024]={0};
HWND hWnd = ::FindWindow(_T("ApplicationFrameWindow"),NULL);
hWnd = ::FindWindowEx(hWnd,0,L"Windows.UI.Core.CoreWindow",NULL);
if(NULL != hWnd)
{
IAccessible paccMainWindow = NULL;
HRESULT hr;
CString strM;
//Get IAccessible Interface Point
if(S_OK == (hr = AccessibleObjectFromWindow(hWnd,
OBJID_WINDOW,
IID_IAccessible,
(void
*)&paccMainWindow)))
{
int index;
BOOL found = false;
IAccessible* paccControl = NULL;
VARIANT varControl;
CoInitialize(NULL);

        if(true == EnumUIChild(paccMainWindow, &paccControl, &varControl))
        {
            BSTR bstrURL;
            hr = paccControl->get_accValue(varControl,&bstrURL);
            if( DISP_E_MEMBERNOTFOUND == hr)
            {
                ::MessageBox(NULL,L"DISP_E_MEMBERNOTFOUND",L"msg",NULL);
            }
            else if( E_INVALIDARG == hr)
            {
                ::MessageBox(NULL,L"E_INVALIDARG",L"msg",NULL);
            }
            else if( S_OK == hr)
            {
                ::MessageBox(NULL,L"S_OK",L"msg",NULL);
            }

            if(SUCCEEDED(hr) &&bstrURL)
            {
                char* szEdit1 = _com_util::ConvertBSTRToString(bstrURL);
                mbstowcs(szEdit, szEdit1, MAX_PATH);
                ::SysFreeString( bstrURL );
            }
            paccControl->Release();
            VariantClear(&varControl);
        };
        paccMainWindow->Release();
    }
}
return szEdit;

}

上面是完整代码,在win10 32位上能够获取到浏览器输入的地址,而win10 64位上找到的地址栏元素无法使用get_accValue()获取网址,根据返回值发现,该对象不支持此属性。

解决方案

更新下操作系统,问题解决。

时间: 2024-12-02 12:52:39

edge获取地址 msa-使用MSA技术获取MS Edge浏览器的输入地址,为什么win10 32位能够获取而64位无法获取?的相关文章

解析64位技术应用之操作系统篇

大家知道,只有选择好64位服务器的操作系统和应用服务器软件,64位服务器才能达到很好的普及与应用,64位服务器才能"名副其实". 目前Unix.Windows Server和Linux在64位网络操作系统上的三足鼎立之势已经日趋明显.虽然Unix在企业级高端应用的领先地位还在,但Windows Server 2003的推出以及Linux 2.6内核的更新对Unix市场带来的威胁使其不得不断推陈出新以应对这种压力. 在大型企业中,全面部署Linux或从Windows向Linux转移所需的

java正则表达式小练习(IP地址检测、排序,叠词的处理,邮件地址的获取)

import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; class MyComparator implements Comparator<String>{ public int compare(String ip1, String ip2) { Pattern p

ios-iOS使用mapkit获取mapView上某一点的坐标反地理编码出来的地址不正确

问题描述 iOS使用mapkit获取mapView上某一点的坐标反地理编码出来的地址不正确 iOS使用mapkit获取mapView上某一点的坐标反地理编码出来的地址不正确.我在网上查了半天没有查到解决办法. 解决方案 你调用mapkit用的是哪个经纬度?你上面有3个经纬度. 解决方案二: 经纬度都对不上,应该是取错点了吧

利用SHDocVw.ShellWindows为什么获取不到IE浏览器非输入网址?

问题描述 例如输入www.csdn.net然后随便点击一个咨询(会新增一个标签页),这是使用SHDocVw.ShellWindows的LocationURL只能获取到http://www.csdn.net/,而获取不到点击打开的咨询地址(http://news.csdn.net/a/20120629/2806996.html).如果是直接在地址栏输入:http://news.csdn.net/a/20120629/2806996.html,则可以获得.这种情况怎么处理才能让程序获取到点击链接打开

java获取客服端信息的方法(系统,浏览器等)_java

如下所示: String agent = request.getHeader("user-agent"); System.out.println(agent); StringTokenizer st = new StringTokenizer(agent,";"); st.nextToken(); String userbrowser = st.nextToken(); System.out.println(userbrowser); String useros =

【技术贴】visual stdio 2005下载地址,vs2005下载地址 vs2005正版破解 v

[技术贴]visual stdio 2005中文版下载地址,vs2005下载地址 vs2005正版破解 vs2005注册码页面地址:http://soft.pdsu.edu.cn/list.asp?id=1215下地地址:http://soft.pdsu.edu.cn/download.asp?id=1215&downid=1 [Visual.Studio..net.2005.简体中文版]正式版key:KYTYH-TQKW6-VWPBQ-DKC8F-HWC4JVisual Studio 2005

sql server-WIN732位 64位获取sqlserver2008连接速度慢

问题描述 WIN732位 64位获取sqlserver2008连接速度慢 我用exe4j打包了swing程序,win7系统在打开这个exe程序时,首次获取jdbc sqlserver2008连接速度很慢,第二次之后就快了很多,这是什么原因呢?TCPIP自动适配功能也关闭了,网络也设置成工作网络. 是哪里的问题呢?求指导 解决方案 看看是否存在dns解析,在有dns解析的时候,第一次是很慢的,之后就快多了.

兼容问题- JS获取文件file路径取出图片信息,求兼容浏览器代码谢谢!

问题描述 JS获取文件file路径取出图片信息,求兼容浏览器代码谢谢! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> JS 文件大小及类型判断 *{}{ font-size:12px;} <!-- function ShowInfo(sUrl) { va

php禁止直接从浏览器输入地址访问.PHP文件

  比如说我http://www.111cn.net /xx.php 这个文件我不想让别人直接从浏览器输入地址访问 但是如果从任何网站连接http://www.111cn.net /xx.php过来就可以访问 本机建立连接也无法访问跳转到另外的地址 1.在xx.php文件头部写上以下代码就可以了 $fromurl="http://www.111cn.net /"; //跳转往这个地址. if( $_SERVER['HTTP_REFERER'] == "" ) { h