以下是我尝试做的事情,非常感谢此处的任何帮助。
我正在尝试使用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似乎应该是正确的方法,任何关于它为什么不能工作的想法?
答案 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循环中,因此它将持续运行,允许一遍又一遍地调用它。实质上,此代码将执行以下操作:
#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在尝试解决问题时的意见。