3

私のWPFアプリケーションでは、コンソールウィンドウをデバッグ/メッセージウィンドウとして使用しています。ユーザーが望むようにウィンドウを表示および非表示にするオプションが設定されており、すべてがうまく機能します。唯一の問題は、ユーザーがコンソールウィンドウを閉じると、プログラム全体が終了することです。ユーザーがXをクリックしたときに、アプリケーションを終了するのではなく、コンソールを非表示にするように、これをオーバーライドするにはどうすればよいですか?

これは私がこれまでに持っているものです:

const int SW_HIDE = 0;
const int SW_SHOW = 5;
public static bool ConsoleVisible { get; private set; }

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


public static void HideConsole()
{
    var handle = GetConsoleWindow();
    ShowWindow(handle, SW_HIDE);
    ConsoleVisible = false;

}
public static void ShowConsole()
{
    var handle = GetConsoleWindow();
    ShowWindow(handle, SW_SHOW);
    ConsoleVisible = true;
}

**これを利用したい人のためにあなたは必要です:using System.Runtime.InteropServices;

このコードはこの回答から派生しました:https ://stackoverflow.com/a/3571628/649382

** 編集 **

もう少し見回すと、これは不可能のようです。私はここで答えを見ました:https ://stackoverflow.com/a/12015131/649382コードがC ++にあるように見え、それがC#であることがわからないことを除いて、終了ボタンの削除についても受け入れられます。別。

**編集2**

私はC#への変換を理解することができ、それを以下の答えとして書きました。

4

2 に答える 2

5

したがって、すでに説明したように、コンソールウィンドウがWPF/アプリケーションウィンドウを閉じるのを防ぐ方法はありません。Windows Vistaの前にはいくつかの回避策がありましたが、それ以降、それらは削除されました(おそらくセキュリティ上の理由から)。私が思いついた回避策は、コンソールウィンドウの[終了]ボタンを無効にし、アプリケーションに表示/非表示オプションを配置することでした。アプリケーション開始クラスは次のようになります。

using System;
using System.Windows;
using System.Runtime.InteropServices;

namespace MyApp
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            ConsoleVisible = true;
            DisableConsoleExit();
        }

        #region Console Window Commands

        // Show/Hide
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

        const uint SW_HIDE = 0;
        const uint SW_SHOWNORMAL = 1;
        const uint SW_SHOWNOACTIVATE = 4; // Show without activating
        public static bool ConsoleVisible { get; private set; }

        public static void HideConsole()
        {
            IntPtr handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE);
            ConsoleVisible = false;

        }
        public static void ShowConsole(bool active = true)
        {
            IntPtr handle = GetConsoleWindow();
            if (active) { ShowWindow(handle, SW_SHOWNORMAL); }
            else { ShowWindow(handle, SW_SHOWNOACTIVATE); }
            ConsoleVisible = true;
        }

        // Disable Console Exit Button
        [DllImport("user32.dll")]
        static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("user32.dll")]
        static extern IntPtr DeleteMenu(IntPtr hMenu, uint uPosition, uint uFlags);

        const uint SC_CLOSE = 0xF060;
        const uint MF_BYCOMMAND = (uint)0x00000000L;

        public static void DisableConsoleExit()
        {
            IntPtr handle = GetConsoleWindow();
            IntPtr exitButton = GetSystemMenu(handle, false);
            if (exitButton != null) DeleteMenu(exitButton, SC_CLOSE, MF_BYCOMMAND);
        }

        #endregion
    }
}

これが同様の問題を抱えている可能性のあるすべての人に役立つことを願っています。

于 2013-01-19T19:34:59.260 に答える
0

AllocConsoleを使用してコンソールを作成し、 FreeConsoleを使用してリリースすることを検討する必要があると思います。そうすれば、WPFアプリケーションを実行したまま、ユーザーがコンソールウィンドウを閉じることができるようになる可能性があります。

于 2013-01-19T18:04:39.850 に答える