这是一个挺老的示例,应该和现在的酷狗不匹配。仅供参考【F1取路径等信息】
/* ;----------------------------------- ; ACC控制酷狗音乐 - By FeiYue ; ; 备注:热键可以改为自己喜欢的 ;----------------------------------- */ #NoEnv ;-- 获取【Acc路径】及其他信息 F1:: obj:=Acc_GetInfoUnderCursor() MsgBox, 4096,, % " Path = " obj.Path . "`n Hwnd = " obj.Hwnd . "`n Title = " obj.Title . "`n Class = " obj.Class . "`n Role = " obj.Role . "`n State = " obj.State . "`n Name = " SubStr(obj.Name,1,100) . "`n Value = " SubStr(obj.Value,1,100) return ;-- 获取所有【Acc路径】及文本 F12:: MouseGetPos,,, id info:={role:"", name:"", value:""} MsgBox, 4096,, % Clipboard:=Acc_GetAllText(id, info) return ;F3:: 酷狗音乐("上一首") ;F4:: 酷狗音乐("下一首") ;F5:: 酷狗音乐("播放/暂停") ;F6:: 酷狗音乐("我喜欢") 酷狗音乐(命令) { SetBatchLines, -1 SetTitleMatchMode, 2 DetectHiddenWindows, On WinGet, List, List, 酷狗音乐 ahk_exe KuGou.exe IfLess, List, 1, return Loop, % List { id:=List%A_Index% WinGetPos,,, w, h, ahk_id %id% if (A_Index=1 or w*h>max) okid:=id, max:=w*h } 酷狗9:={ "上一首" : "4.2.X.16.1|4.3.X.16.1" , "播放/暂停" : "4.2.X.16.2|4.3.X.16.2" , "下一首" : "4.2.X.16.3|4.3.X.16.3" , "我喜欢" : "4.2.X.15.1|4.3.X.15.1" } 酷狗8:={ "上一首" : "4.3.7.13.1" , "播放/暂停" : "4.3.7.13.3" , "下一首" : "4.3.7.13.2" , "我喜欢" : "4.3.7.X.5" } For k,v in [酷狗9, 酷狗8] For k2,v2 in StrSplit(v[命令], "|") if (arr:=Acc_GetObjectFromPath(okid, v2, {name:命令})) { Try arr[1].accDoDefaultAction(arr[2]) return } } ;================================================== Acc_GetAllText(hwnd, info="", first=1) { static arr, text if (first) arr:=[], text:="", hwnd:=Acc_ObjectFromWindow(hwnd, 0) arr.Push(0) For i,v in Acc_Children(Acc:=hwnd) { arr[arr.length()]++, path:="" Loop, % arr.length() path.=(A_Index=1 ? "" : ".") . arr[A_Index] Role:=Name:=Value:="", j:=IsObject(v) Try Role:=j ? v.accRole(0) : Acc.accRole(v) Try Name:=j ? v.accName(0) : Acc.accName(v) Try Value:=j ? v.accValue(0) : Acc.accValue(v) path:=j ? path : RegExReplace(path, "(\w+)$", "c$1") if (!info.role||Role=info.role) and (!info.name||Name~=info.name) and (!info.value||Value~=info.value) text.=path " ---- " Acc_GetRoleText(Role) " " . Format("0x{:X}",Role) " [" SubStr(Name,1,100) . "][" SubStr(Value,1,100) "]`r`n" if (j) Acc_GetAllText(v, info, 0) } arr.Pop() if (first) return (s:=text, text:="") ? s:s } Acc_GetObjectFromPath(hwnd, path, info="", Acc=0, first=1) { if (first) hwnd:=Acc_ObjectFromWindow(hwnd, 0) if !IsObject(v:=hwnd) and !IsObject(Acc) return Loop, Parse, path, ., cC%A_Space% { if !IsObject(Acc:=v) return if (i:=A_LoopField)="X" { path:=Trim(SubStr(path, InStr(path,"X")+1), ".") For k,v in Acc_Children(Acc) if (arr:=Acc_GetObjectFromPath(v,path,info,Acc,0)) return arr return } if (j:=Acc.accChildCount)<i or (j<1) return v:=Acc_Children(Acc,i) } if IsObject(v) Acc:=v, v:=0 Role:=Name:=Value:="" Try Role:=Acc.accRole(v) Try Name:=Acc.accName(v) Try Value:=Acc.accValue(v) if (!info.role||Role=info.role) and (!info.name||Name~=info.name) and (!info.value||Value~=info.value) return [Acc, v] } Acc_GetInfoUnderCursor() { ; MouseGetPos,,,, cid, 2 ; SendMessage, WM_GETOBJECT:=0x3D, 0, 1,, ahk_id %cid% Acc:=Acc_ObjectFromPoint(child) Try Name:=Acc.accName(child) Try Value:=Acc.accValue(child) Try Role:=Acc.accRole(child) Try State:=Acc.accState(child) path:=Acc_GetAccPath(Acc, child, hwnd) WinGetTitle, title, ahk_id %hwnd% WinGetClass, class, ahk_id %hwnd% hwnd:=Format("{:#x}", hwnd) Role:=Acc_GetRoleText(Role) " " Format("0x{:X}",Role) State:=Acc_GetStateText(State) " " Format("0x{:X}",State) return { Path:path, Hwnd:hwnd, Title:title, Class:class , Name:Name, Value:Value, Role:Role, State:State } } Acc_GetAccPath(Acc, ChildID, ByRef hwnd) { t2:=hwnd:="", id:=Acc_WindowFromObject(Acc) DllCall("GetWindowThreadProcessId","ptr",id,"uint*",AccPID) While id:=Acc_WindowFromObject(Parent:=Acc_Parent(Acc)) { DllCall("GetWindowThreadProcessId","ptr",id,"uint*",pid) if (pid!=AccPID) Break t1:=Acc_GetEnumIndex(Acc, ChildID) t2:=(ChildID ? "c":"") t1 "." t2 hwnd:=id, (ChildID ? ChildID:=0 : Acc:=Parent) } return SubStr(t2,1,-1) } Acc_GetEnumIndex(Acc, ChildID=0) { Role:=State:=Name:="" Try Role :=Acc.accRole(ChildID) Try State:=Acc.accState(ChildID) Try Name :=Acc.accName(ChildID) Pos:=Acc_Location(Acc,ChildID).pos Count:=Acc.accChildCount if (ChildID) { For Each, child in Acc_Children(Acc) if !IsObject(child) { vRole:=vState:=vName:="" Try vRole :=Acc.accRole(child) Try vState:=Acc.accState(child) Try vName :=Acc.accName(child) if (vRole=Role) and (vState=State) and (vName=Name) and (Acc_Location(Acc,child).pos=Pos) return A_Index } return } For Each, child in Acc_Children(Acc_Parent(Acc)) if IsObject(child) { vRole:=vState:=vName:="" Try vRole :=child.accRole(0) Try vState:=child.accState(0) Try vName :=child.accName(0) if (vRole=Role) and (vState=State) and (vName=Name) and (child.accChildCount=Count) and (Acc_Location(child).pos=Pos) return A_Index } } ; Acc.ahk - thanks Sean, jethrow, jeeswg, teadrinker 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, ., cC%A_Space% try { Parent:=AccObj 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 } if !IsObject(AccObj) ChildId:=AccObj, AccObj:=Parent Acc_Error(AccError) StringReplace, Cmd, Cmd, %A_Space%, , All properties.HasKey(Cmd)? Cmd:=properties[Cmd]:"" try { if (Cmd = "Location") ret_val := Acc_Location(AccObj,ChildId+0).pos 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_Location(Acc, ChildId=0) ; adapted from Sean's code { 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("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, N="") { 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 { ListLines, % (lls:=A_ListLines=0?"Off":"On")?"Off":"Off" SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1" Loop, %cChildren% i:=(A_Index-1)*(A_PtrSize*2+8), child:=NumGet(varChildren,i+8) , Children[A_Index]:=( (j:=NumGet(varChildren,i,"ushort")=9) && (N=""||N=A_Index) ? Acc_Query(child):child ) , (j ? ObjRelease(child):"") SetBatchLines, %bch% ListLines, %lls% return Children.MaxIndex()?(N=""?Children:Children[N]):"" } 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), child:=NumGet(varChildren,i+8) if NumGet(varChildren,i,"ushort")=9 AccChild:=Acc_Query(child), ObjRelease(child) , Acc_Role(AccChild)=Role?Children.Push(AccChild):"" else Acc_Role(Acc, child)=Role?Children.Push(child):"" } return Children.MaxIndex()?Children:"", ErrorLevel:=0 } else ErrorLevel := "AccessibleChildren DllCall Failed" } if Acc_Error() throw Exception(ErrorLevel,-1) } Acc_Query(Acc) ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530 { static IAccessible:="{618736e0-3c3d-11cf-810c-00aa00389b71}" try return ComObj(9, ComObjQuery(Acc,IAccessible), 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 }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)