Приложение WinForm с консолью - Отключение кнопок «Свернуть / Развернуть / Свернуть» при появлении консоли - PullRequest
1 голос
/ 10 ноября 2011

Я пишу приложение Windows Forms, которое может запустить консоль для отладки. Я хочу отключить кнопку закрытия консоли, чтобы приложение windows form не могло быть закрыто с помощью кнопки закрытия консоли. Я построил скелет тестового кода, и он работает. Код ниже:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace bsa_working
{
    public partial class Form1 : Form
    {
        static bool console_on = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (ViewConsole.Checked)
            {
                Win32.AllocConsole();
                ConsoleProperties.ConsoleMain();

                // Set console flag to true
                console_on = true;  // will be used later
            }
            else
                Win32.FreeConsole();
        }
    }

    public class Win32
    {
        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();
        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();
    }

    public class ConsoleProperties
    {
        [DllImport("user32.dll")]
        static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

        [DllImport("user32.dll")]
        static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("user32.dll")]
        static extern IntPtr RemoveMenu(IntPtr hMenu, uint nPosition, uint wFlags);

        internal const uint SC_CLOSE = 0xF060;
        internal const uint MF_GRAYED = 0x00000001;
        internal const uint MF_BYCOMMAND = 0x00000000;

        public static void ConsoleMain()
        {
            IntPtr hMenu = Process.GetCurrentProcess().MainWindowHandle;
            IntPtr hSystemMenu = GetSystemMenu(hMenu, false);

            EnableMenuItem(hSystemMenu, SC_CLOSE, MF_GRAYED);
            RemoveMenu(hSystemMenu, SC_CLOSE, MF_BYCOMMAND);

            // Set console title
            Console.Title = "Test Console";

            // Set console surface foreground and background color
            Console.BackgroundColor = ConsoleColor.DarkBlue;
            Console.ForegroundColor = ConsoleColor.White;
            Console.Clear();
        }
    }
}

Код работает нормально, КРОМЕ:

  1. Когда код скомпилирован и запущен в первый раз, X на консоли НЕ отображается серым цветом, а в приложении Windows Forms отображается серым цветом. Однако, когда код закрывается и запускается снова, код работает как следует; то есть X на консоли отображается серым цветом, а приложение Windows Forms - таким, каким оно должно быть. Есть идеи, почему и как это можно исправить?

  2. Иногда консоль появляется за формой победы. Есть ли способ заставить консоль всегда идти впереди?

Кроме того, есть ли способ закрепить консоль в определенном месте WinForm? приложение? Я могу установить его размер, чтобы, если бы я мог прикрепить его в определенном месте, я мог создать для него место в форме.

1 Ответ

1 голос
/ 10 ноября 2011

Чтобы это работало, вам нужно изменить IntPtr hMenu = Process.GetCurrentProcess().MainWindowHandle; на использование дескриптора окна Консольного окна (который можно получить, позвонив по номеру GetConsoleWindow()).

Для отображения сверху вы можете использовать, например, SetForegroundWindow с дескриптором окна консоли .

Насчет закрепления Я действительно не уверен, что это дажевозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...