【问题标题】:Auto Maximize skype live conversation window with Autohotkey使用 Autohotkey 自动最大化 Skype 实时对话窗口
【发布时间】:2015-12-18 21:49:17
【问题描述】:

这是我正在尝试做的事情,非常感谢这里的任何帮助。

我正在尝试使用 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%

能够获得代码的简化版本以使用热键启动,但无法让 WinWait 函数按照@Schneyer 的方式工作。

热键激活的功能代码

#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 似乎应该是正确的方法,有什么想法为什么它不起作用?

【问题讨论】:

  • 是什么不工作?你可以把问题缩小到哪一行?
  • 据我所知,不工作的部分是识别 LiveConversationWindow 的正确类。我已经尝试了以下 ahk_class LiveConversationWindow ahk_class TLiveConversation1 (它显示为检查员的 ahk_class tSkMainForm 的 ClassNN)我已经使用下面@Schneyer 给出的代码完成了此操作,并在下面的评论之后显示。

标签: autohotkey skype


【解决方案1】:

问题

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

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

工作代码

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

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

#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%

WinWait ahk_class TConversationForm
WinActivate
WinMaximize

【讨论】:

  • WinWait 功能似乎对我没有任何帮助。我已经尝试了下面显示的 ahk_class 的许多变体,但在启动对话时似乎没有一个工作。我什至尝试使用 MsgBox 进行测试,看看它是否启动了任何操作而没有成功。 WinWait ahk_class TLiveConversation1 WinWait ahk_class TConversationForm WinWait ahk_class TLiveConversationWindow
  • @Chardho 使用 Window Spy 工具确定正确的类。
  • 我确实使用了 spy 工具来查找课程……但不确定我是否正确找到它。我认为问题在于 ClassNN TLiveConversation1 是带有 ahk_class tSkMainForm 的窗口内的控件。该控件表示我想用 WinWait 关闭的活动对话......只是不确定当它可能是控件而不是窗口时我是否可以使用 WinWait。 tSkMainForm 似乎相对持久,而窗口或控件是 tSkMainForm 的子项。我不能像在 WinWait 中那样使用 tSkMainForm,因为它在调用启动前后持续存在。
【解决方案2】:

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

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

使用 ahk_class 来识别 Skype 呼叫何时处于活动状态的问题在于,在检查器中标识为 classNN TLiveConversation1 的“活动呼叫窗口”实际上是 ahk_class tSkMainForm 窗口中的控件而不是窗口。这使得 WinWait 函数在调用启动时无法识别它。

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

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

  1. 创建一个存在于 ahk_class tSkMainForm 中的控件列表 (SkypeControlList)。
  2. 不断循环通过 SkypeControlList
  3. 当启动新的实时对话时,将存在一个控件 TLiveConversation1
  4. 一旦 TLiveConversation1 存在运行必要的代码
#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 为解决此问题提供的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多