Groups | Blog | Home
all groups > dotnet general > april 2006 >

dotnet general : Attach to Console?


lgs.lgs
4/24/2006 11:04:14 PM
Is redirection acceptable?

Create a file named foo.inp, then do

conapp.exe < foo.inp

ME
4/24/2006 11:51:16 PM
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

ME
4/25/2006 12:16:03 AM
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
[quoted text, click to view]

James Park
4/25/2006 6:45:11 AM
[quoted text, click to view]

You could try using the SendKeys class.

James Park
4/25/2006 8:54:39 AM
[quoted text, click to view]

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

ME
4/25/2006 9:30:59 AM
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.


[quoted text, click to view]

ME
4/25/2006 9:54:53 AM
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();
}
}
}


[quoted text, click to view]

James Park
4/25/2006 10:15:08 AM
[quoted text, click to view]

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}");

ME
4/25/2006 11:56:29 AM
THANK YOU! Grabbing the foreground window is what I had overlooked.

Thanks,

Matt
[quoted text, click to view]

cody
4/26/2006 12:00:00 AM
[quoted text, click to view]

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

AddThis Social Bookmark Button