使用Autohotkey自动最大化Skype实时对话窗口

时间:2015-12-18 21:49:17

标签: autohotkey skype

以下是我尝试做的事情,非常感谢此处的任何帮助。

我正在尝试使用Autohotkey脚本自动化最大化Skype中的实时对话窗口。我试图做到这一点,所以我可以使用Skype调用远程机器并让它自动回答(这是skype本机)...一旦我有一个实时对话窗口,我想最大化实时对话窗口填满屏幕。

我已经给了这个镜头,但不知怎的,我认为我没有正确的ahk_class用于实时对话窗口,但可能还有其他我想念的东西。我已经放置了我在下面尝试过的代码......任何帮助都会很棒。

#NoEnv  ; Recommended for performance and compatibility with future     AutoHotkey releases.
#Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

#Persistent

IfWinExist, TLiveConversationWindow ;
{
WinActivate
WinMaximize
send !{Enter};When using skype normally this Alt+Enter will maximize the window
return
}

我还尝试使用此代码来确定实时对话窗口的正确类...但到目前为止还没有帮助。

Alt & Enter::
IfWinExist, TLiveConversationWindow
WinActivate
ControlFocus, ClassNN TLiveConversation1
ControlClick, ClassNN TLiveConversation1, , , , 2, 
MouseClick, left, , , 2
send !{Enter}
; now we get the ID & CLASS
WinGet, Active_Window_ID, ID, A
WinGetClass, Active_Window_Class, A
MsgBox, The active window's class is "%Active_Window_class%" and ID is %Active_Window_ID%

能够使用热键启动代码的简化版本,但无法按照@Schneyer的说法使WinWait功能正常工作。

由热键激活的功能代码

#NoEnv
#Warn
#Persistent
SendMode Input
SetWorkingDir %A_ScriptDir%

; Skype Maximizer initiating functions
^!p::
;WinWait ahk_class TLiveConversation1
;WinWait ahk_class TConversationForm
;WinWait ahk_class TLiveConversationWindow
;WinMaximize ahk_class TLiveConversation1

;functioning code
;Activate tSkMainForm.
WinActivate ahk_class tSkMainForm

;Send Alt Enter Input to maximize.
SendInput !{Enter}

;TLiveConversationWindow Always On Top
WinSet, AlwaysOnTop,,ahk_class TLiveConversationWindow

;Minimize main form
WinMinimize ahk_class tSkMainForm

Return

当使用任何WinWait函数交换^!p ::时,似乎没有任何事情发生。 WinWait似乎应该是正确的方法,任何关于它为什么不能工作的想法?

2 个答案:

答案 0 :(得分:0)

问题

#persistent让脚本运行,但是在启动脚本时,代码仍然只执行一次。之后它保持活跃但什么都不做。 使用WinWait等待窗口出现(如果您希望它运行多次,请将其包装在Loop中)。

使用ahk_class来搜索窗口类而不是窗口标题

工作代码

您可以使用AHK中包含的 Window Spy 工具。使用正在运行的AHK脚本的托盘图标菜单启动它。

我在代码中使用 TConversationForm ,但它适用于每个窗口类。

#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%

WinWait ahk_class TConversationForm
WinActivate
WinMaximize

答案 1 :(得分:0)

通过AHK论坛扫描我找到了一篇帖子,让我找到了解决这个小问题的答案。请查看以下链接以获取更多信息。

https://autohotkey.com/board/topic/96491-detect-when-a-classnn-window-exists/

使用ahk_class来识别skype呼叫何时处于活动状态的问题是"活动呼叫窗口"在inspector中标识为classNN TLiveConversation1实际上是ahk_class tSkMainForm窗口内的Control而不是Window。这使得WinWait功能无法在呼叫启动时识别它。

为了识别Control,有必要循环遍历ahk_class tSkMainForm中的控件(使用WinGet),直到TLiveConversation存在,然后启动所需的任何子例程。对我来说,这是最大化实时对话窗口。

从WinGet函数开始,您将看到执行此操作的代码。所有这些都包含在while循环中,因此它将持续运行,允许一遍又一遍地调用它。实质上,此代码将执行以下操作:

  1. 创建ahk_class tSkMainForm中存在的控件列表(SkypeControlList)。
  2. 不断循环通过SkypeControlList
  3. 启动新的实时对话时,控件TLiveConversation1将存在
  4. TLiveConversation1后,运行必要的代码
  5. #NoEnv 
    #Warn 
    #Persistent
    SendMode Event
    SetWorkingDir %A_ScriptDir%
    
    DetectHiddenWindows, on
    
    stop = 0
    Loop
    {
    
    While stop = 0
    {
    
        WinGet, SkypeControlList, ControlList, ahk_class tSkMainForm
        Loop, Parse,SkypeControlList, `n
        {
            ;Loop to search for control TLiveConversation1
            if (A_LoopField = "TLiveConversation1")
            {
    
            ;Deactivate active screensaver
            PostMessage, 0x0112, 0x0F060, 0,, A
            ;RegWrite REG_SZ, HKEY_CURRENT_USER, Control Panel\Desktop, ScreenSaveActive, 0
            ;SetKeyDelay, 500
            Send {Esc}
    
    
            ;Activate tSkMainForm.
            WinActivate ahk_class tSkMainForm
    
    
            ;Send Alt Enter Input to maximize.
            Send !{Enter}
    
            ;TLiveConversationWindow Always On Top
            WinSet, AlwaysOnTop,,ahk_class TLiveConversationWindow
    
    
            stop = 1
            sleep, 100
            }           
        }
    }
    
    IfWinExist ahk_class TLiveConversationWindow
        {
        stop = 1
        sleep, 1000
        }
    IfWinNotExist ahk_class TLiveConversationWindow
        {
        ;Minimize all windows by win+D show desktop
        send #d
        sleep,1000
    
    
        ; is that call quality feedback window up?  kill it.
        SetTitleMatchMode, Regex
        WinClose, ^Skype.*Call quality feedback$
    
        stop = 0
        }
    sleep 1000
    
    
    }
    Return
    

    只要在被调用的计算机上没有活动的屏幕保护程序,上述代码就可以正常运行。如果有活动的屏幕保护程序,则呼叫将应答但屏幕保护程序不会消失。您可以看到代码残留试图从屏幕保护程序中唤醒计算机(这当前不起作用)。

    我还添加了一些代码来清理体验,例如删除Skype在通话后抛出的通话质量弹出窗口,以及在通话结束后清除桌面。

    感谢@Blauhirn和@Schneyer在尝试解决问题时的意见。