2009-12-15 1 views
0

У меня есть сценарий powershell для входа в систему. Как часть скрипта, он запускает приложение, а затем ждет 4 секунды, чтобы дождаться, пока компьютер наверстает упущенное, а затем отправит несколько нажатий клавиш.powershell, sendkey() и appactive() strangness

$deviceID = "123xyz" 
invoke-item ("C:\myapp") 
... 
$myshell = New-Object -com "Wscript.Shell" 
start-sleep -s 4 
$myshell.AppActivate("myapp");$myshell.sendkeys("1");$myshell.sendkeys("{TAB}");$myshell.sendkeys("$deviceID");$myshell.sendkeys("{ENTER}") 

Он отлично работает, если пользователь не нажимает нигде во время входа в систему. Если они это сделают, приложение никогда не получит ключевые штрихи, и приложение начнет мигать на панели задач.

Похоже, AppActivate(), похоже, действительно не работает. Кто-нибудь имеет какие-либо данные по этому поводу?

ответ

0

Похоже, что фокус удаляется из активного приложения и не может быть возвращен, возможно, потому, что цель кликов является модальной (заставка и т. Д.). Есть ли способ отправить поток данных в приложение через каналы или стандартный ввод?

+0

это другие программы загрузки, но он отлично работает без щелчка мыши (на рабочий стол). AFAIK sendkeys() является единственным, почему вход для отправки без использования сторонних powerpaks и т. Д. – falkaholic

+1

Вы пишете приложение своим вызовом? Если это так, у вас много вариантов, если нет, то еще есть. В зависимости от типа приложения он может или не может принимать параметры командной строки, разрешает перенаправление ввода в консоль (StdIn, StdOut) и нашу поддержку прямого DDE. – GrayWizardx

5

Необходимо, чтобы приложение было передним планом. PowerShell Community Extensions имеет Set-ForegroundWindow Командлет, который может помочь с этим:

Add-Type -AssemblyName System.Windows.Forms 
$proc = Get-Process notepad 
Set-ForegroundWindow $proc.MainWindowHandle 
Start-Sleep -Seconds 2 # Just so you can see the window before it closes :-) 
[Windows.Forms.SendKeys]::SendWait('%{F4}') 

Это использование PowerShell V2 в Add-Type Командлет. Также обратите внимание, что SendKeys доступен в .NET.

Смежные вопросы