1

パラメータを渡すかどうかに応じて、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 .....

4

0 に答える 0