パラメータを渡すかどうかに応じて、Windowsフォームおよびコンソールアプリケーションとして動作するアプリケーションがあります。パラメータを渡すと、コンソール アプリケーションとして動作します。
この最後のケースでは、コンソール アプリケーションとして、次を使用してコンソールにアタッチします。
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
そのため、アプリの冒頭で、次のように呼び出します。
AttachConsole(-1);
後で、コマンドラインでパラメーターとして渡された文字列パラメーターまたはパラメーターを読み取るだけで、これらの文字列を暗号化して返します。その後、次を使用してユーザーキーが押されるのを待ちます。
Console.ReadKey(true);
ユーザーが任意のキーを押した後、コンソール ウィンドウを閉じたい。
私の問題は、ユーザーがキーを押したときにアプリケーションが続行されず、押されたこのキーが別の接続されたコンソールによってキャッチされるため、キーを待機し続けることです。したがって、アプリケーションを続行するには、ユーザーがキーを 2 回押す必要があります。最初にキーを押すと、コマンド プロンプトが再度出力されます (これは接続されたコンソールからのものです)。
どうすればこれを解決できますか?
アップデート:
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 .....