使用 Powershell 最大化 Lync 窗口?

Posted

技术标签:

【中文标题】使用 Powershell 最大化 Lync 窗口?【英文标题】:Maximizing Lync Window Using Powershell? 【发布时间】:2015-05-08 14:23:01 【问题描述】:

我创建了一个脚本,它会自动与我选择的用户发起视频通话。

运行时,脚本会停止视频通话,同时 lync 视频通话窗口会闪烁。

如何在脚本运行时让这个窗口最大化并进入全屏模式?

非常感谢您的帮助。

下面是我的代码

    $assemblyPath = “C:\Program Files (x86)\Microsoft Office 2013\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.DLL”
    Import-Module $assemblyPath


    $LyncClient = [Microsoft.Lync.Model.LyncClient]::GetClient()

    $StartVideoCallMethod = 
        $Conversation = $this.ConversationManager.AddConversation();
        $contact = $LyncClient.ContactManager.GetContactByUri("useremailhere") 
        [void]$Conversation.AddParticipant($contact);
        [void]$Conversation.Modalities['AudioVideo'].BeginConnect(, 0);

        ;
    Add-Member -InputObject $LyncClient -MemberType ScriptMethod -Name StartVideoCall -Value $StartVideoCallMethod -Force;

    # Initiate the video call
    $Conversation = $LyncClient.StartVideoCall();

【问题讨论】:

看看这个函数。我过去曾在 Lync 上成功使用过它:gist.github.com/jakeballard/11240204 【参考方案1】:

我没有 Lync,但这样的东西应该可以工作。我正在使用进程名称(或我猜的名称)来获取 Lync 窗口的 MainWindowHandle,然后发送该命令以最大化(cmd=3,请参阅此处以获取完整的值列表:https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx )。

如果多个进程按名称匹配,此代码可能会中断,但它应该可以帮助您开始;如果您可以获得 PID 或其他更好的唯一标识符,请使用它。只是弄乱 Get-Process 的输出,您应该会看到许多选项,并记住您始终可以使用 Where 子句来过滤输出。或者当然,如果有某种方法可以直接从 $LyncClient 获取 MainWindowHandle,那就更好了。

$w = Get-Process -Name "Lync"
$Win32ShowWindowAsync = Add-Type –memberDefinition ` 
  '[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);' `
-name “Win32ShowWindowAsync” -namespace Win32Functions –passThru

$Win32ShowWindowAsync::ShowWindowAsync($w.MainWindowHandle,3) | Out-Null

【讨论】:

埃里克,非常感谢你。我现在遇到的问题是,有时它会最大化 lync 窗口本身,而另一些则会最大化视频通话窗口。我尝试添加一个睡眠时间(你在最后看到的那个),它在 lync 已经运行时工作正常,但一开始的异常处理程序将打开 lync 如果它不是会导致它在需要时完美工作到。这绝对是因为我没有指定进程“lync”的哪个窗口。谢谢你的代码。绝对有所作为。 显然我的代表不够高,无法在下面评论您的答案(今天刚刚创建了这个帐户),但如果您还没有,我会考虑检查 $LyncClient(使用 $LyncClient | Get-Member 来查看它的属性、方法等),看看你是否可以以某种方式从中提取 PID 或其他一些唯一标识符。或者在 Lync 运行时单独从 shell 运行 Get-Process,看看是否有任何关于返回的信息可以使用。【参考方案2】:

这是我到目前为止的代码。

仍然需要一些调整来完善它,但它可以完成工作。

调整将指定最大化哪个窗口,因为它有时会最大化 lync 联系人窗口。

代码

$assemblyPath = “C:\Program Files (x86)\Microsoft Office 2013\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.DLL”
    Import-Module $assemblyPath
   $exePath = "C:\Program Files\Microsoft Office 15\root\office15\lync.exe"

   if(!(get-process | ?$_.path -eq $exePath))
   Start-Process -FilePath $exePath -WindowStyle Maximized
   Start-Sleep -s 10
   


   $LyncClient = [Microsoft.Lync.Model.LyncClient]::GetClient()

   $StartVideoCallMethod = 
       $Conversation = $this.ConversationManager.AddConversation();
       $contact = $LyncClient.ContactManager.GetContactByUri("ernesto.gomila@quirchfoods.com") 
       [void]$Conversation.AddParticipant($contact);
       [void]$Conversation.Modalities['AudioVideo'].BeginConnect(, 0);

       ;
   Add-Member -InputObject $LyncClient -MemberType ScriptMethod -Name StartVideoCall -Value $StartVideoCallMethod -Force;

   # Initiate the video call
   $Conversation = $LyncClient.StartVideoCall();

   #Maximize window
   $w = Get-Process -Name "lync"
   $Win32ShowWindowAsync = Add-Type –memberDefinition @"
   [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
   "@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru

   Start-Sleep -s 2

   $Win32ShowWindowAsync::ShowWindowAsync($w.MainWindowHandle,3) | Out-Null

【讨论】:

以上是关于使用 Powershell 最大化 Lync 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 通过 AD 组成员授予 Lync 策略

Lync PowerShell:为用户启用企业语音

使用PowerShell更新 Lync/Skype边缘服务器内网证书

在 Powershell 中迭代字符串的通用列表(Lync 聊天室成员)

从 C# 调用 Lync server 2010 Powershell cmdlet

Lync SDK - 为 Lync 制作插件 - 对话窗口扩展