2016-02-28 64 views
0

我有以下兩行代碼會將相應的窗口放在前面,這將幫助我自動截屏。但問題是,有時候,它的作用就像是一種魅力,有時它不會。當我說它不起作用時,我並不是說它沒有任何錯誤信息或警告。什麼都沒發生。只是代碼運行,窗戶不在前面。AppActivate在Powershell中不一致地工作

我想知道這段代碼是否有任何隱藏的先決條件可以成功運行?在我運行這段代碼之前,有問題的窗口應該處於任何狀態嗎?

下面是代碼:

[void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic") 
[Microsoft.VisualBasic.Interaction]::AppActivate("R") 
+0

確定'WindowTitle'在不起作用時沒有什麼不同?你有沒有嘗試過使用'ProcessID'? –

+0

在兩種情況下,窗口標題都相同。我們如何使用ProcessID來做到這一點?當我啓動一個COM對象時,Powershell是否返回進程ID? –

+0

如果進程ID是1580,那麼''[Microsoft.VisualBasic.Interaction] :: AppActivate(1580)' –

回答

0

可能性是,該計劃趕快往回PowerShell的控制切換到所需的程序採取控制...嘗試循環激活,直到你把截圖..

+0

無論我運行多少次,有時它都不會出現在前面.. –

1

我以前在使用Title-overload時遇到了麻煩。此外,Windows標題中的單個更改將打破AppActivate(string Title)

它是否更好地與ProcessID -overload?防爆。

$excelpid = (Get-Process excel).ID 
[Microsoft.VisualBasic.Interaction]::AppActivate($excelpid) 

如果您使用的是COM的應用程序,你需要得到一個基於MainWindowHandle的過程中,像這樣:

[void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic") 

#start excel 
$excel = New-Object -ComObject excel.application 

#make excel visible 
$excel.Visible = $true 

#get pid from windows handle 
$excelpid = (Get-Process | Where-Object { $_.MainWindowHandle -eq $excel.Hwnd }).Id 

#Activate window 
[Microsoft.VisualBasic.Interaction]::AppActivate($excelpid) 
0

我只是重複使用AppActivate幾個times.I知道這是不是漂亮的解決但它適用於我。

示例代碼在這裏。

for ($i = 1; $i -lt 5; $i++) 
{ 
    [Microsoft.VisualBasic.Interaction]::AppActivate("R") 
} 
相關問題