Attach to Console?

M

ME

I have a application that someone else has wrote that runs in a console
window. It does not take parameters, but when running it asks three
questions and then exits. I would like to write a small utility to attach
to the console app, send the necessary answers (typically typing the letter
"y" and enter) and then leave. Is this a possiblity for .net? If so what
would be the best approach?

Thanks,

Matt
 
L

lgs.lgs

Is redirection acceptable?

Create a file named foo.inp, then do

conapp.exe < foo.inp
 
M

ME

Unfortunately no. The console app is the first part of a larger application
that starts up a custom web server after answering some questions. I wish
it were that easy. Basically I have no control of the console app until it
asks the first question.

Thanks,

Matt
 
J

James Park

ME said:
I have a application that someone else has wrote that runs in a console
window. It does not take parameters, but when running it asks three
questions and then exits. I would like to write a small utility to attach
to the console app, send the necessary answers (typically typing the letter
"y" and enter) and then leave. Is this a possiblity for .net? If so what
would be the best approach?

You could try using the SendKeys class.
 
M

ME

Unfortunately this didn't seem to work either. It appears SendKeys uses the
API SendMessage to transfer the keys. The CONSOLE doesn't seem to process
window messages.
 
J

James Park

ME said:
Unfortunately this didn't seem to work either. It appears SendKeys uses
the API SendMessage to transfer the keys. The CONSOLE doesn't seem to
process window messages.

You could also try P/Invoke'ing SendInput, which often works when
keybd_event and SendKeys doesn't.
 
M

ME

I have figured out how to ATTACH to a running console. I have yet to figure
out how to send an ENTER key, but here is what i have so far:

public class Attach
{
[DllImport("kernel32", SetLastError = true)]
public static extern bool AttachConsole(uint dwProcessId);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
public static extern bool FreeConsole();
public static void AttachToCMD()
{
//Get a list of running process that are command windows
Process[] ps = Process.GetProcessesByName("cmd");
Process p = null;
uint pID = 0;
bool retVal = false;
string inputText = string.Empty;
//if we found command windows then attach to the first one
if (ps.Length > 0)
{
p = ps[0];
}
//if we successfully attached then get uint with process id so
//can pass the id to the AttachConsole method
if (p != null)
{
pID = Convert.ToUInt32(p.Id);
}
//if our pid > 0 then attach
if (pID > 0)
{
//attach to the running console. remember that an app can only
//attach to one console at a time
retVal = AttachConsole(pID);
//Perform our writes
Console.WriteLine("DIR");
//Detach from the console
FreeConsole();
}
}
}
 
J

James Park

ME said:
Unfortunately this didn't seem to work either. It appears SendKeys uses
the API SendMessage to transfer the keys. The CONSOLE doesn't seem to
process window messages.

The following seems to work for me.

string cmdPath = Environment.ExpandEnvironmentVariables("%COMSPEC%");
Process consoleProcess = Process.Start(cmdPath);
Thread.Sleep(2000);

SetForegroundWindow(consoleProcess.MainWindowHandle);
SendKeys.SendWait("{ENTER}");
 
C

cody

I have figured out how to ATTACH to a running console. I have yet to
figure out how to send an ENTER key, but here is what i have so far:

Doesn't neither "\r", "\n" or "\r\n" work?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top