我有一个应用程序,它表现为 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 参数 1 参数 2 .....