Bir konsol uygulaması yürütürken konsol penceresini gizlemenin bir yolu var mı?
Şu anda bir konsol işlemi başlatmak için bir Windows Forms uygulaması kullanıyorum, ancak görev çalışırken konsol penceresinin görüntülenmesini istemiyorum.
Bir konsol uygulaması yürütürken konsol penceresini gizlemenin bir yolu var mı?
Şu anda bir konsol işlemi başlatmak için bir Windows Forms uygulaması kullanıyorum, ancak görev çalışırken konsol penceresinin görüntülenmesini istemiyorum.
Yanıtlar:
ProcessStartInfoSınıfı kullanıyorsanız, pencere stilini gizli olarak ayarlayabilirsiniz - konsol (GUI değil) uygulamalarında, CreateNoWindow'u şu şekilde ayarlamanız gerekir true:
System.Diagnostics.ProcessStartInfo start =
new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console
Konsol uygulamasını yazdıysanız, uygulamayı varsayılan olarak gizleyebilirsiniz.
Yeni bir konsol uygulaması oluşturun ve ardından "Çıktı Türü" türünü "Windows Uygulaması" olarak değiştirin (proje özelliklerinde yapılır)
Process Class kullanıyorsanız yazabilirsiniz.
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
önce yourprocess.start();ve işlem gizlenecek
Basit cevap şudur: Konsol uygulamanızın özelliklerine (projenin özellikleri) gidin. "Uygulama" sekmesinde, "Çıktı türü" nü "Windows Uygulaması" olarak değiştirin. Bu kadar.
Konsolu işlemden ayırmak için FreeConsole API'sını kullanabilirsiniz :
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(tabii ki bu yalnızca konsol uygulamasının kaynak koduna erişiminiz varsa geçerlidir)
FreeConsoleAdından ne diyor, onu çağrılmadan önce konsolu göstermesini Windows'u engellemez.
[DllImport("kernel32.dll")] static extern bool AllocConsole();, standart bir Win32 uygulamasından bir konsol ile kolayca çalışmanıza izin verir
Çıktıyla ilgileniyorsanız, bu işlevi kullanabilirsiniz:
private static string ExecCommand(string filename, string arguments)
{
Process process = new Process();
ProcessStartInfo psi = new ProcessStartInfo(filename);
psi.Arguments = arguments;
psi.CreateNoWindow = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.UseShellExecute = false;
process.StartInfo = psi;
StringBuilder output = new StringBuilder();
process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };
// run the process
process.Start();
// start reading output to events
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// wait for process to exit
process.WaitForExit();
if (process.ExitCode != 0)
throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);
return output.ToString();
}
Verilen komut satırı programını çalıştırır, bitmesini bekler ve çıktıyı dize olarak döndürür.
Kullanıcı girişi gerektirmeyen bir program oluşturuyorsanız, bunu her zaman bir hizmet olarak oluşturabilirsiniz. Bir hizmet herhangi bir kullanıcı arayüzü göstermez.
DLL dosyasını içe aktarmak için bunu sınıfınıza ekleyin:
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
const int SW_HIDE = 0;
const int SW_SHOW = 5;
Ve sonra gizlemek istiyorsanız bu komutu kullanın:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
Ve konsolu göstermek istiyorsanız:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
Tam olarak ne istediğini cevaplamadığımı biliyorum, ama doğru soruyu sorup sormadığını merak ediyorum.
Neden ikisini de kullanmıyorsunuz:
İstediğiniz tek şey bir işlem yapmaksa, bunlar daha iyi seçeneklere benziyor.
Buradaki diğer yanıtların söylediği gibi "Çıktı türü" Console.Innü "Windows Uygulaması" olarak değiştirebilirsiniz, ancak bunun bir NullStreamReader olacağı için kullanamayacağınız anlamına geleceğini unutmayın.
Console.Outve Console.Erroryine de iyi çalışıyor gibi görünüyor.
Console.Inşey girmek için konsol olmadığında neden kimse kullansın ki? Nereden erişilebilir herhangi bir şey gelmelidir Console.In? Bu hiç mantıklı değil. Başka bir deyişle: O tamamen açık ve mantıklı Console.Inbir olduğu NullStreamReaderbu durumda.
Adam Markowitz'in yukarıdaki cevabına dayanarak, aşağıdakiler benim için çalıştı:
process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();
Paylaşmak için genel bir çözümüm var:
using System;
using System.Runtime.InteropServices;
namespace WhateverNamepaceYouAreUsing
{
class Magician
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int HIDE = 0;
const int SHOW = 5;
public static void DisappearConsole()
{
ShowWindow(GetConsoleWindow(), HIDE);
}
}
}
Bu sınıfı projenize ekleyin ve arayın Magician.DisappearConsole(); .
Programı tıklattığınızda başlattığınızda bir konsol yanıp söner. Komut isteminden yürütülürken, komut istemi yürütmeden kısa bir süre sonra kaybolur.
Bunu, görünmez bir süreç olarak bilgisayarımın arka planında sonsuza dek çalışan bir Discord Bot için yapıyorum. TopShelf'in benim için çalışmasını sağlamaktan daha kolaydı. Ben başka bir yerde buldum kodu bazı yardımı ile yazmadan önce birkaç TopShelf öğreticiler bana başarısız oldu. P
Ayrıca, bir Konsol Uygulaması yerine bir Windows Uygulaması olarak başlatmak için Visual Studio> Proje> Özellikler> Uygulama'daki ayarları değiştirmeyi denedim ve projemle ilgili bir şey bunun konsolumu gizlemesini engelledi - belki de DSharpPlus başlangıçta bir konsol başlatmak istediğinden . Bilmiyorum. Nedeni ne olursa olsun, bu sınıf açıldıktan sonra konsolu kolayca öldürmeme izin veriyor.
Umarım bu Büyücü birine yardım eder. ;)