我有一个应用程序,表现为Windows窗体和控制台应用程序,具体取决于我是否传递参数。如果我传递参数,它就像一个控制台应用程序。
在最后一种情况下,作为控制台应用程序,我使用以下命令连接到控制台:
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
所以在应用程序的开头,我将其称为如下:
AttachConsole(-1);
稍后我所做的只是读取字符串参数或在命令行中作为参数传递的参数,并且我将这些字符串加密。之后我等待用户按键使用:
Console.ReadKey(true);
用户按任意键后,我想关闭控制台窗口。
我的问题是,当用户按一个键时,应用程序不会继续,它仍然一直等待一个键,因为按下的这个键被另一个连接的控制台捕获。因此,为了使应用程序继续,用户需要按两次键。在第一次按键时,再次打印命令提示符(这来自附加的控制台)。
我该如何解决这个问题?
更新
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.Run(new MyForm());
}
else
{
// case args.Length > 0
Console.WriteLine("Start my formless app...");
new FormLessApp().Start(args);
}
}
ReadKey在FormLessApp中执行:
public class FormLessApp
{
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int input);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
public FormLessApp()
{
IntPtr ptr = GetForegroundWindow();
int u;
GetWindowThreadProcessId(ptr, out u);
Process process = Process.GetProcessById(u);
if (process.ProcessName == "cmd")
{
AttachConsole(process.Id);
Console.WriteLine("attached to console");
}
}
public void Start(string[] args)
{
// Do some things with args
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
}
}
重现:
打开一个Windows命令提示符(cmd),然后从那里执行:
MyApp.exe param1 param2 .....