2016-09-14 5 views
0

Я сделал программу, которая открывает определенную программу, а затем Ctrl + C это после й количества времени.Передача ключи на открытые окна в PowerShell

Я сейчас использую это [System.Windows.Forms.SendKeys]::SendWait("^{c}"). Будет ли эта цель отображать определенное окно или просто случайно отправить его в текущее окно?

Как я могу сменить его на определенное окно?

Это мой код:

Write-Host "Safe Botting V0.1" 
Write-Host "Initializing..." 
Start-Sleep -s 3 
Write-Host "Program started successfully with no errors." 

While($true) 
{ 
    Write-Host "Starting bot..." 
    Start-Sleep -s 3 
    Start-Process -FilePath E:\Documents\bot.exe 
    Write-Host "Bot started successfully" 
    $rnd = Get-Random -Minimum 1800 -Maximum 10800 
    Write-Host "The bot will run for:" 
    Write-Host $rnd 
    Start-Sleep -s $rnd 
    Write-Host "Bot will now stop!" 
    [System.Windows.Forms.SendKeys]::SendWait("^{c}") 
    Write-Host "Bot terminated" 
    Write-Host "Starting cooldown time" 
    $rnb = Get-Random -Minimum 14400 -Maximum 28800 
    Write-Host "The bot will cooldown for" 
    Write-host $rnb 
    Start-Sleep -s $rnb 
    Write-Host "Cooldown Finished, Restarting" 
    Start-Sleep -s 5 
} 
+3

Что вы на самом деле пытаетесь достичь здесь? Это звучит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem); Я подозреваю, что есть более чистое решение вашей проблемы, например. используя команду 'Taskkill'. Также, пожалуйста, укажите свой фактический код в своем сообщении. –

+0

Программа, пытающаяся запустить, должна быть остановлена ​​Ctrl + C, иначе она не будет загружаться в следующий раз. –

+0

Затем как насчет команды ['Stop-Process'] (https://technet.microsoft.com/en-us/library/ee177004.aspx)? –

ответ

0

Вы можете послать сигнал CTRL_C_EVENT к процессу, если у вас есть идентификатор процесса. В вашем случае вы можете получить это из Start-Process (прочитайте документы, если вы не знаете, как получить идентификатор процесса). Кроме того, можно получить идентификатор процесса из окна ручки:

Find process id by window's handle

Передача сигнала не является тривиальным, но благодаря @ Nemo1024, @KindDragon и переполнение стека он был разработан:

Can I send a ctrl-C (SIGINT) to an application on Windows?

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

В PowerShell это выглядит примерно так:

# be sure to set $ProcessID properly. Sending CTRL_C_EVENT signal can disrupt or terminate a process 
$ProcessID = 1234 
$encodedCommand = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("Add-Type -Names 'w' -Name 'k' -M '[DllImport(""kernel32.dll"")]public static extern bool FreeConsole();[DllImport(""kernel32.dll"")]public static extern bool AttachConsole(uint p);[DllImport(""kernel32.dll"")]public static extern bool SetConsoleCtrlHandler(uint h, bool a);[DllImport(""kernel32.dll"")]public static extern bool GenerateConsoleCtrlEvent(uint e, uint p);public static void SendCtrlC(uint p){FreeConsole();AttachConsole(p);GenerateConsoleCtrlEvent(0, 0);}';[w.k]::SendCtrlC($ProcessID)")) 
start-process powershell.exe -argument "-nologo -noprofile -executionpolicy bypass -EncodedCommand $encodedCommand" 

Да, я знаю, что это очень некрасиво.

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