2015-06-30 3 views
1

У меня есть строка cmd для exe, которая не может меняться, и мне нужно написать скрипт, но у него есть Пауза, встроенная в нее, и я не могу см. любой способ пропустить эту паузу, чтобы остальная часть моего скрипта продолжалась.Пропустить «нажмите любую клавишу, чтобы продолжить» на внешней программе exe

Я перепробовал все виды вещей, в том числе

Цените любой совет

+0

Следует отметить, что был задан аналогичный вопрос [здесь] (http://stackoverflow.com/questions/27088802/batch-file-calling-an-exe-that-has-pause-in-it-how- to-skip) (и связанный выше), но не получил должного ответа – Arvin

ответ

1

Вы можете отправить данные в процесс с использованием Interop. Это называется подключением процесса, и на нем есть несколько ресурсов. Мне это нравится answer.

Это небольшой код, который позволяет отправлять сообщения в справочное приложение . Чтобы отправить символ «A», например, вызовите sendKeystroke(Keys.A) и не забудьте использовать пространство имен System.windows.forms, чтобы иметь возможность использовать объект Keys.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace keybound 
{ 
class WindowHook 
{ 
    [DllImport("user32.dll")] 
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    [DllImport("user32.dll")] 
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 
    [DllImport("user32.dll")] 
    public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

    public static void sendKeystroke(ushort k) 
    { 
     const uint WM_KEYDOWN = 0x100; 
     const uint WM_SYSCOMMAND = 0x018; 
     const uint SC_CLOSE = 0x053; 

     IntPtr WindowToFind = FindWindow(null, "Untitled1 - Notepad++"); 

     IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0); 
     //IntPtr result3 = SendMessage(WindowToFind, WM_KEYUP, ((IntPtr)c), (IntPtr)0); 
    } 
} 
} 

Вы, вероятно, легче, чем они, получая приложение вместо того, чтобы искать процесс, потому что вы можете запустить его из приложения:

Process proc = new Process(); 
proc.StartInfo.FileName = executablePath; 
proc.Start(); 
proc.WaitForInputIdle(); 

Тогда proc.Id будет являться PID.

В качестве альтернативы я просто столкнулся с типом VB example, который кажется еще более простым с использованием функции Shell, но я не использовал его раньше. Вам нужно добавить паузу в приложении дождаться приглашения, но это, кажется чище, чем читать Interop:

Dim ProcID As Integer 
' Start the Calculator application, and store the process id. 
ProcID = Shell("CALC.EXE", AppWinStyle.NormalFocus) 
' Activate the Calculator application. 
AppActivate(ProcID) 
' Send the keystrokes to the Calculator application. 
My.Computer.Keyboard.SendKeys("22", True) 
My.Computer.Keyboard.SendKeys("*", True) 
My.Computer.Keyboard.SendKeys("44", True) 
My.Computer.Keyboard.SendKeys("=", True) 
' The result is 22 * 44 = 968. 

Если ветер с System.ArgumentException, это, вероятно, потому, что функция Shell не получить идентификатор процесса. Это потому, что ему нужно полное доверие. Приложение будет работать, если оно выполняется как администратор. Я не думаю,, вы найдете простой способ обойти это, если вы не можете этого сделать, так как это проблема безопасности, чтобы приложения запускали друг друга, но я мог ошибаться.

+0

Итак, я пытаюсь использовать второй метод, который вы сказали, и когда я его пытаюсь в Visual Studio 2015/2013, я получаю сообщение об ошибке ArgumentException. Необработанное исключение типа ' System.ArgumentException "произошел в Microsoft.VisualBasic.dll Дополнительная информация: Процесс '{0}' не найден. Хотя, если я нажму «Продолжить», он все равно работает, и я получаю 968 Кажется, что в первый раз, когда код пытается прочитать ProcID, он все равно 0, но когда я нажимаю «Продолжить» и он снова пытается, он получает реальное значение ProcID. Есть идеи? – Arvin

+0

Я объяснил исключение. Это означает, что команда Shell была запущена в частичной ситуации доверия. См. Мой последний абзац. –

+0

Хмм, когда я запускаю программу как администратор, я просто получаю «программу, которая перестала работать» с опцией «Отладка» или «Закрыть». – Arvin

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