QQ当前聊天显示

#NoTrayIcon
address:=A_ScriptDir "\qq聊天.ini"
loop 
{
    IniRead name, %address%, qq, name
    If (name="ERROR")
    {
        InputBox, name, , 输入qq群名或qq联系人完整名字
        ;MsgBox,%name%
        IniWrite %name%, %address%, qq, name
        IniRead name, %address%, qq, name
        ;MsgBox,%name%
    }
    WinTitle:="ahk_class TXGuiFoundation ahk_exe QQ.exe"
    ExcludeTitle:="QQ"
    path:="4.3.4.1.1.2.1.2.1.2.1.5.1"
    ;4.3.4.1.1.2.1.2.1.2.1.5.1
    ;4.3.4.1.1.2.1.2.1.2.1.5.1
    hwnd:=WinExist(name)
    Acc:=Acc_Get("Object", path, 0, "ahk_id" hwnd)
    If (hwnd="0X0")
    {
        MsgBox, 请双击聊天窗口左边前置
    }
    accChildCount := Acc.accChildCount
    accChildCount := accChildCount -1
    t := Acc.accName(accChildCount * 4 + 4)
    id:= StrSplit(t," ")[1]
    id:= StrSplit(id,"】")[2]
    time:= StrSplit(t," ")[2]
    message:= StrSplit(t," ")[2]
    ;Clipboard := message
    ;MsgBox % t

    ToolTip %id% : `n %message% `n F8退出 `n F10重设监控名字 `n F12暂停
    SetTimer, RemoveToolTip, -5000
}
Return

f8:: ExitApp
f10::FileDelete, %address%
f12:: Pause

RemoveToolTip:
ToolTip
return



Acc_Get(Cmd, ChildPath="", ChildID:=0, WinTitle="", WinText="", ExcludeTitle="", ExcludeText=""){
    static properties := {Action:"DefaultAction", DoAction:"DoDefaultAction", Keyboard:"KeyboardShortcut"}
    AccObj := IsObject(WinTitle) ? WinTitle
    : Acc_ObjectFromWindow(WinExist(WinTitle, WinText, ExcludeTitle, ExcludeText), 0 )
    If ComObjType(AccObj, "Name") != "IAccessible"
        ErrorLevel := "Could not access an IAccessible Object"
    Else
    {
        StringReplace, ChildPath, ChildPath, _, %A_Space%, All
        AccError:=Acc_Error(), Acc_Error(true)
        Loop Parse, ChildPath, ., %A_Space%
            Try
        {
            If A_LoopField is digit
                Children:=Acc_Children(AccObj), m2:=A_LoopField ; mimic "m2" output In Else-statement
            Else
                RegExMatch(A_LoopField, "(\D*)(\d*)", m)
            , Children:=Acc_ChildrenByRole(AccObj, m1), m2:=(m2?m2:1)
            If Not Children.HasKey(m2)
                Throw
            AccObj := Children[m2]
        }
        Catch
        {
            ErrorLevel:="Cannot access ChildPath Item #" A_Index " -> " A_LoopField, Acc_Error(AccError)
            If Acc_Error()
                Throw Exception("Cannot access ChildPath Item", -1, "Item #" A_Index " -> " A_LoopField)
            Return
        }
        Acc_Error(AccError)
        StringReplace, Cmd, Cmd, %A_Space%, , All
        properties.HasKey(Cmd)? Cmd:=properties[Cmd]:""
            Try
            {
                If (Cmd = "Location")
                    AccObj.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0)
                , ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
                , ret_val := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int")
                . " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
                Else If (Cmd = "Object")
                    ret_val := AccObj
                Else If Cmd In Role,State
                    ret_val := Acc_%Cmd%(AccObj, ChildID+0)
                Else If Cmd In ChildCount,Selection,Focus
                    ret_val := AccObj["acc" Cmd]
                Else
                    ret_val := AccObj["acc" Cmd](ChildID+0)
            }
            Catch
            {
                ErrorLevel := """" Cmd """ Cmd Not Implemented"
                If Acc_Error()
                    Throw Exception("Cmd Not Implemented", -1, Cmd)
                Return
            }
        Return ret_val, ErrorLevel:=0
    }
    If Acc_Error()
        Throw Exception(ErrorLevel,-1)
}

Acc_GetInfoUnderCursor(){
    Acc := Acc_ObjectFromPoint(child)
    Try value := Acc.accValue(child)
    If (!value)
        Try value := Acc.accName(child)
    accPath := Acc_GetAccPath(acc, hwnd).path
    Return {text: value, path: accPath, hwnd: hwnd}
}

Acc_GetAccPath(Acc, Byref hwnd=""){
    hwnd:=Acc_WindowFromObject(Acc)
    While (Acc_WindowFromObject(Parent:=Acc_Parent(Acc))=hwnd)
        t2 := Acc_GetEnumIndex(Acc) "." t2, Acc := Parent
    Return {AccObj:Acc, Path:SubStr(t2,1,-1)}
}

Acc_GetEnumIndex(Acc, ChildId=0){
    If (!ChildId)
    {
        Role:=Name:=""
        Try Role:=Acc.accRole(0)
        Try Name:=Acc.accName(0)
        Count:=Acc.accChildCount, Pos:=Acc_Location(Acc).pos
        For Each, child In Acc_Children(Acc_Parent(Acc))
        {
            If Not IsObject(child)
                Continue
            vRole:=vName:=""
            Try vRole:=child.accRole(0)
            Try vName:=child.accName(0)
            If (Role=vRole && Name=vName && Count=child.accChildCount
                && Pos=Acc_Location(child).pos)
        Return A_Index
    }
}
Else
{
    Role:=Name:=""
    Try Role:=Acc.accRole(ChildId)
    Try Name:=Acc.accName(ChildId)
    Pos:=Acc_Location(Acc,ChildId).pos
    For Each, child In Acc_Children(Acc)
    {
        If IsObject(child)
            Continue
        vRole:=vName:=""
        Try vRole:=Acc.accRole(child)
        Try vName:=Acc.accName(child)
        If (Role=vRole && Name=vName
            && Pos=Acc_Location(Acc,child).pos)
        Return A_Index
    }
}
}

Acc_Location(Acc, ChildId=0){
    Try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
    Catch
        Return
    Return {x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int")
    , pos:"x" NumGet(x,0,"int")" y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")}
}

Acc_Parent(Acc){
    Try parent:=Acc.accParent
    Return parent?Acc_Query(parent):""
    }

    Acc_Child(Acc, ChildId=0){
        Try child:=Acc.accChild(ChildId)
    Return child?Acc_Query(child):""
    }

    Acc_Init(){
        Static h
        If (!h && !(h:=DllCall("GetModuleHandle", "Str", "oleacc", "Ptr")))
            h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
    }

    Acc_WindowFromObject(pacc){
        Acc_Init()
        If (DllCall("oleacc\WindowFromAccessibleObject", "Ptr"
            , IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0)
    Return hWnd
}

Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild){
    Acc_Init()
    If (DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd
        , "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr"
    , VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0)
    Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = ""){
    Acc_Init()
    If (DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""
        ? 0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc
    , "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0)
    Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromWindow(hWnd, idObject := -4){
    Acc_Init()
    If DllCall("oleacc\AccessibleObjectFromWindow"
        , "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", (VarSetCapacity(IID,16)
    +NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64")
    +NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,IID,8,"Int64"))*0
    +&IID, "Ptr*", pacc)=0
    Return ComObjEnwrap(9,pacc,1)
}

Acc_Children(Acc){
    If (ComObjType(Acc,"Name") != "IAccessible")
        ErrorLevel := "Invalid IAccessible Object"
    Else
    {
        Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
        If DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0
            , "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0
        +&varChildren, "Int*",cChildren)=0
        {
            Loop %cChildren%
                i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i)
            , Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child)
            , NumGet(varChildren,i-8)=9?ObjRelease(child):""
            Return Children.MaxIndex()?Children:""
            } Else
            ErrorLevel := "AccessibleChildren DllCall Failed"
        }
        If Acc_Error()
            Throw Exception(ErrorLevel,-1)
    }

    Acc_ChildrenByRole(Acc, Role){
        If (ComObjType(Acc,"Name")!="IAccessible")
            ErrorLevel := "Invalid IAccessible Object"
        Else
        {
            Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
            If DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc)
                , "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren
            , cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0
            {
                Loop %cChildren%
                {
                    i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i)
                    If NumGet(varChildren,i-8)=9
                        AccChild:=Acc_Query(child), ObjRelease(child)
                    , Acc_Role(AccChild)=Role?Children.Insert(AccChild):""
                        Else
                            Acc_Role(Acc, child)=Role?Children.Insert(child):""
                        }
                        Return Children.MaxIndex()?Children:"", ErrorLevel:=0
                    } Else
                    ErrorLevel := "AccessibleChildren DllCall Failed"
                }
                If Acc_Error()
                    Throw Exception(ErrorLevel,-1)
            }

            Acc_Query(Acc){
                Try Return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
            }

            Acc_Role(Acc, ChildId=0){
                Try Return ComObjType(Acc,"Name")="IAccessible"
                ? Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object"
                }

                Acc_State(Acc, ChildId=0){
                Try Return ComObjType(Acc,"Name")="IAccessible"
                ? Acc_GetStateText(Acc.accState(ChildId)):"invalid object"
                }

                Acc_GetRoleText(nRole){
                    Acc_Init()
                    nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0)
                    VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize)
                    DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1)
                Return sRole
            }

            Acc_GetStateText(nState){
                Acc_Init()
                nSize := DllCall("oleacc\GetStateText", "Uint", nState, "Ptr", 0, "Uint", 0)
                VarSetCapacity(sState, (A_IsUnicode?2:1)*nSize)
                DllCall("oleacc\GetStateText", "Uint", nState, "str", sState, "Uint", nSize+1)
                Return sState
            }

            Acc_Error(p=""){
                static setting:=0
                Return p=""?setting:setting:=p
            }

给TA捐赠
共{{data.count}}人
人已捐赠
其他

point

2021-12-2 15:24:00

其他

Ra2AlertAll

2021-12-2 15:31:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索