在外部 exe 程序上跳过 'press any key to continue'
Skipping 'press any key to continue' on external exe program
我为我提供了一个 cmd 行 exe,我无法更改它,我需要编写一个脚本,但它内置了一个暂停,我看不出有任何方法可以跳过这个暂停,所以剩下的我的脚本可以继续。
我尝试过各种方法,包括
- @echo | call program.exe
- program.exe < nul
- cmd /c echo y &echo.| program.exe
- 周杰伦的回答here
- 这些的变化和组合
- 检查程序/?查看是否有跳过暂停切换,但没有
感谢任何建议
您可以使用互操作将数据发送到进程。它被称为挂钩进程,上面有一些资源。我喜欢这个 answer。
This is a little code that allows you to send message to a
backgrounded application. To send the "A" char for example, simply
call sendKeystroke(Keys.A)
, and don't forget to use namespace
System.windows.forms to be able to use the Keys object.
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 函数没有获得进程 ID。这是因为它需要充分的信任。如果 运行 作为管理员,该应用程序将运行。我不认为 认为 如果你不能这样做,你会找到一个简单的方法来解决这个问题,因为让应用程序 运行 彼此存在是一个安全问题,但我可以错了。
我为我提供了一个 cmd 行 exe,我无法更改它,我需要编写一个脚本,但它内置了一个暂停,我看不出有任何方法可以跳过这个暂停,所以剩下的我的脚本可以继续。
我尝试过各种方法,包括
- @echo | call program.exe
- program.exe < nul
- cmd /c echo y &echo.| program.exe
- 周杰伦的回答here
- 这些的变化和组合
- 检查程序/?查看是否有跳过暂停切换,但没有
感谢任何建议
您可以使用互操作将数据发送到进程。它被称为挂钩进程,上面有一些资源。我喜欢这个 answer。
This is a little code that allows you to send message to a backgrounded application. To send the "A" char for example, simply call
sendKeystroke(Keys.A)
, and don't forget to use namespace System.windows.forms to be able to use the Keys object.
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 函数没有获得进程 ID。这是因为它需要充分的信任。如果 运行 作为管理员,该应用程序将运行。我不认为 认为 如果你不能这样做,你会找到一个简单的方法来解决这个问题,因为让应用程序 运行 彼此存在是一个安全问题,但我可以错了。