Autohotkey 如何使用自动热键获取Microsoft团队活动会议窗口?

Autohotkey 如何使用自动热键获取Microsoft团队活动会议窗口?,autohotkey,microsoft-teams,Autohotkey,Microsoft Teams,在Microsoft Team Windows客户端中,我希望能够使用自动热键识别当前活动的会议窗口。 考虑你可以有几个团队窗口打开(弹出聊天室,主窗口,几个会议窗口与一些保持,…) (背景:我想这样做是为了能够发送会议特定的操作热键。)我试图通过窗口标题找到它,但团队没有以特定的方式命名会议窗口 我可以通过AccViewer发现,主团队窗口的名称以“| Microsoft团队,主窗口”结尾。所以至少我可以排除这个 这是我找到的最好的解决办法。 但它需要用户确认哪个窗口是当前会议窗口(如果不明显

在Microsoft Team Windows客户端中,我希望能够使用自动热键识别当前活动的会议窗口。 考虑你可以有几个团队窗口打开(弹出聊天室,主窗口,几个会议窗口与一些保持,…)


(背景:我想这样做是为了能够发送会议特定的操作热键。)

我试图通过窗口标题找到它,但团队没有以特定的方式命名会议窗口

我可以通过AccViewer发现,主团队窗口的名称以“| Microsoft团队,主窗口”结尾。所以至少我可以排除这个

这是我找到的最好的解决办法。 但它需要用户确认哪个窗口是当前会议窗口(如果不明显)


代码可以在以下要点中找到:

我采用了另一种基于FindText的方法来排除任何用户提示。 它会在Teams窗口中检查UI元素(如Leave和Resume)是否可用,以100%排除错误的窗口

请参阅本帖中的详细说明: 与电影放映。 下面是要点中的代码:

摘录如下:

Teams_GetMeetingWindow(useFindText:="" , restore := True){
; See implementation explanations here: 
;   https://tdalon.blogspot.com/2021/04/ahk-get-teams-meeting-window.html
;   https://tdalon.blogspot.com/2020/10/get-teams-window-ahk.html

If (useFindText="")
    useFindText := PowerTools_GetParam("TeamsMeetingWinUseFindText") ; Default 1

If (useFindText) {
    If (restore)
        WinGet, curWinId, ID, A
    ResumeText:="|<>*138$51.zzzzzzzzw3zzzzzzzUDzzzzzzwtzzzzzzzbA64NU1kQ1423A04FUtUQNa8aAX0EXAlY1a9zUNaAbwt4Y0AlYHb4461aAkTzzzzzzzzU" ; FindText for Resume
    LeaveText:="|<>*168$66.zzzzzzzzzzzzzzzzDzzzzzy01zzDzzzzzs00TzDzzzzzk00DzDkkFW3U7k7zDUG9YFUDk7zD6T9YlUTs7zD0E841kTs7zD7nAAzszwDz022AAHzzzzz0UECS3zzzzzzzzzzzU"
}

WinGet, Win, List, ahk_exe Teams.exe
TeamsMainWinId := Teams_GetMainWindow()
TeamsMeetingWinId := PowerTools_RegRead("TeamsMeetingWinId")
WinCount := 0
Select := 0


Loop %Win% {
    WinId := Win%A_Index%
    If (WinId = TeamsMainWinId) { ; Exclude Main Teams Window 
        ;WinGetTitle, Title, % "ahk_id " WinId
        ;MsgBox %Title%
        Continue
    }
    WinGetTitle, Title, % "ahk_id " WinId  
    
    IfEqual, Title,, Continue
    Title := StrReplace(Title," | Microsoft Teams","")
    If RegExMatch(Title,"^[^\s]*\s?[^\s]*,[^\s]*\s?[^\s]*$") or RegExMatch(Title,"^[^\s]*\s?[^\s]*,[^\s]*\s?[^\s]*\([^\s\(\)]*\)$") ; Exclude windows with , in the title (Popped-out 1-1 chat) and max two words before , Name, Firstname               
        Continue
    
    If RegExMatch(Title,"^Microsoft Teams Call in progress*") or RegExMatch(Title,"^Microsoft Teams Notification*") or RegExMatch(Title,"^Screen sharing toolbar*")
        Continue
    
    If (useFindText) {
        ; Exclude window with no Leave element
        WinActivate, ahk_id %WinId%
        If !(ok:=FindText(,,,, 0, 0, LeaveText,,0)) {
            Continue
        } 
        
        ; Final check - exclude window with Resume element = On hold meetings
        If (ok:=FindText(,,,, 0, 0, ResumeText,,0)) {
            Continue
        } 
    }
        
    WinList .= ( (WinList<>"") ? "|" : "" ) Title "  {" WinId "}"
    WinCount++

    ; Select by default last meeting window used
    If WinId = %TeamsMeetingWinId% 
        Select := WinCount  
} ; End Loop

If (WinCount = 0)
    return
If (WinCount = 1) { ; only one other window
    RegExMatch(WinList,"\{([^}]*)\}$",WinId)
    TeamsMeetingWinId := WinId1
    PowerTools_RegWrite("TeamsMeetingWinId",TeamsMeetingWinId)
    return TeamsMeetingWinId
}

If (restore)
    WinActivate, ahk_id %curWinId%

LB := WinListBox("Teams: Meeting Window", "Select your current Teams Meeting Window:" , WinList, Select)
RegExMatch(LB,"\{([^}]*)\}$",WinId)
TeamsMeetingWinId := WinId1
PowerTools_RegWrite("TeamsMeetingWinId",TeamsMeetingWinId)
return TeamsMeetingWinId

} ; eofun
Teams\u GetMeetingWindow(useFindText:=“”,restore:=True){
;参见此处的实施说明:
;   https://tdalon.blogspot.com/2021/04/ahk-get-teams-meeting-window.html
;   https://tdalon.blogspot.com/2020/10/get-teams-window-ahk.html
如果(useFindText=“”)
useFindText:=PowerTools_GetParam(“TeamsMeetingWinUseFindText”);默认值1
如果(useFindText){
如果(恢复)
WinGet,curWinId,ID,A
简历文本:=“|*138$51.zzzzzzzzzzzzzzzzzzzzzba64NU1KQ1423A04FUTUQNA8AAX0Exaly1A9ZunaaB4461Aktzzzzzu”找到简历文本
LeaveText:=“|*168$66.ZZZZZZZZZZZZZZZZZZZZZZZK00DZDKKfW3U7K7ZDUG9YFUD7ZD6T9YLUTs7ZD0E841KTS7ZD7ZD7NAAZZZZWDZ022AAHZZZZZZZ0UECS3ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
}
WinGet,Win,List,ahk_exe Teams.exe
TeamsMainWinId:=团队\u GetMainWindow()
TeamsMeetingWinId:=电动工具\重新研磨(“TeamsMeetingWinId”)
WinCount:=0
选择:=0
循环%Win%{
WinId:=赢%A\u索引%
如果(WinId=TeamsMainWinId){;排除主团队窗口
;Wingtittle,标题,%“ahk_id”WinId
;MsgBox%标题%
继续
}
Wingtittle,标题,%%“ahk_id”WinId
如果相等,标题,则继续
标题:=StrReplace(标题为“| Microsoft团队”,”)
如果RegExMatch(标题“^[^\s]*\s?[^\s]*,[^\s]*\s?[^\s]*$”)或RegExMatch(标题“^[^\s]*\s?[^\s]*\s?[^\s]*\([^\s\(\)*”;则排除标题中带有的窗口(弹出1-1个聊天窗口),并且在名称、名字和名字之前最多两个单词
继续
如果是RegExMatch(标题“^Microsoft团队呼叫进行中*”)或RegExMatch(标题“^Microsoft团队通知*”)或RegExMatch(标题“^Screen sharing toolbar*”)
继续
如果(useFindText){
;排除不带Leave元素的窗口
WinActivate,ahk_id%WinId%
If!(确定:=FindText(、、、0、0、LeaveText、、0)){
继续
} 
;最终检查-排除带有Resume元素的窗口=保留会议
If(确定:=FindText(,,,0,0,ResumeText,0)){
继续
} 
}
WinList.=((WinList“”)?“|”:“”)标题“{”WinId“}”
温克蒙特++
;默认情况下选择上次使用的会议窗口
如果WinId=%TeamsMeetingWinId%
选择:=WinCount
};端环
如果(WinCount=0)
返回
如果(WinCount=1){;只有一个其他窗口
RegExMatch(WinList,“\{([^}]*)\}$”,WinId)
TeamsMeetingWinId:=WinId1
PowerTools_RegWrite(“TeamsMeetingWinId”,TeamsMeetingWinId)
返回团队Meetingwinid
}
如果(恢复)
WinActivate,ahk_id%curWinId%
LB:=WinListBox(“团队:会议窗口”,“选择您当前的团队会议窗口:”,WinList,Select)
RegExMatch(LB,“\{([^}]*)\}$”,WinId)
TeamsMeetingWinId:=WinId1
PowerTools_RegWrite(“TeamsMeetingWinId”,TeamsMeetingWinId)
返回团队Meetingwinid
} ; 伊奥芬

您介意我重新问这个问题,并悬赏他们是否可以在没有用户输入的情况下自动确定哪个窗口是正确的会议窗口吗?我还想要一些东西,可以确定哪个窗口是正确的会议窗口,因为window Spy中的所有统计信息要么是空的,无用的,要么与主团队窗口相同。此外,我认为弹出式聊天和会议窗口仅适用于启用MS Team Beta版的用户,但据我所知,它可能也已添加到今年早些时候的主版本中。@Spyre弹出式聊天是很久以前发布的(根据快速谷歌搜索,大约2020年5月)我不想为了悬赏而重复这个问题。你不能赏金给我吗?我不能因为某些原因;由于某些原因,我在这一页上没有“开始赏金”按钮。但是,如果我转到任何其他问题,即使是有接受答案的问题,它也会显示按钮。@Spyre问题必须是2天以前的问题。我不知道这一点,我将启动它,因为按钮现在已经为我显示。