সি # কনসোল অ্যাপ্লিকেশনটির কনসোল উইন্ডোটি দেখান / লুকান


191

কারও নিজস্ব কনসোল উইন্ডোটি কীভাবে আড়াল করা যায় সে সম্পর্কিত তথ্যের জন্য আমি চারপাশে গুগল করেছিলাম। আশ্চর্যজনকভাবে, আমি খুঁজে পেতে পারি কেবলমাত্র সমাধান হ্যাকি সমাধান যা এর শিরোনামFindWindow() অনুসারে কনসোল উইন্ডোটি খুঁজে পেতে জড়িত । আমি উইন্ডোজ এপিআইতে কিছুটা গভীর খনন করেছি এবং দেখতে পেয়েছি যে আরও অনেক ভাল এবং সহজ উপায় আছে, তাই আমি অন্যদের সন্ধানের জন্য এটি এখানে পোস্ট করতে চেয়েছিলাম।

আপনি নিজের সি # কনসোল অ্যাপ্লিকেশনটির সাথে সংযুক্ত কনসোল উইন্ডোটি কীভাবে গোপন করবেন (এবং দেখান)?

উত্তর:


265

এখানে কীভাবে:

using System.Runtime.InteropServices;

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

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

const int SW_HIDE = 0;
const int SW_SHOW = 5;

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);

14
উইন্ডোটি এখনও মুহুর্তে শুরুতে উপস্থিত হয়। আমি অনুমান করি যে এই ধরণের কোনও উপায় নেই, যদি না অ্যাপ্লিকেশন ধরণের পরিবর্তন হয়?
সিআরান গালাগের

2
এটির আশপাশে কোনও উপায় থাকলে ভাল হবে। আমি যখন ডিবাগ মোডে থাকি তখন আমি কনসোলটি প্রদর্শন করতে পারি, তবে আমি যখন সাধারণ রান মোডে থাকি তখন কেবল আমার প্রোগ্রামটি চালান এবং প্রস্থান করুন (উইন্ডো ছাড়া))
ভ্যাকাকানো

8
@ ভ্যাকানকো: কেবলমাত্র csprojফাইলটি ম্যানুয়ালি সম্পাদনা করার মাধ্যমে আপনার অ্যাপ্লিকেশনটিকে ডিবাগ মোডে কনসোল অ্যাপ্লিকেশন হিসাবে তৈরি করা সম্ভব । ভিজ্যুয়াল স্টুডিওতে এটি করার জন্য জিইউআই নেই, তবে আপনি csprojফাইলটি সঠিকভাবে সম্পাদনা করলে এটি সেটিংসটিকে সম্মান জানাবে ।
টিমউই

3
প্রয়োজন:using System.Runtime.InteropServices;
অ্যান্থনি নিকলস

5
এটি একটি খুব সুন্দর উত্তর কিন্তু আমি যুক্ত করতে পারে যে আরও একটি বিকল্প যোগ করতে হবে const int SW_SHOWMINIMIZED = 2;এবং তারপরেShowWindow(handle, SW_SHOWMINIMIZED); এইভাবে কনসোলটি লুকানো হয় না, কেবল ছোট করা হয়।
কানসাইরোবট

265

শুধু অ্যাপ্লিকেশানের যেতে প্রোপার্টি এবং পরিবর্তন আউটপুট টাইপ থেকে কনসোল অ্যাপ্লিকেশন থেকে উইন্ডোজ অ্যাপ্লিকেশন


9
যদিও এটি ওপি-র প্রশ্নের উত্তর দেয় না, আমি আপনাকে এই উত্তর দেওয়ার জন্য সত্যই প্রশংসা করি। আমার ঠিক এটির প্রয়োজন ছিল :)
kayleeFrye_onDeck

6
এটি সমাধান নয়, কারণ এইভাবে উইন্ডোটি দেখানো যায় না।
মিশা ওলিওস্কি

6
এটি পোস্টার যা চেয়েছিল তার কোনও সমাধান নয়।
কানসাইরোবট

1
দুর্দান্ত হলেও, এই কনসোলটি কখন প্রদর্শিত হবে এবং লুকিয়ে রাখবে তা সমাধান আপনাকে প্রোগ্রামিয়ালি নিয়ন্ত্রণ করতে দেয় না। বলুন আপনি একটি কনসোল প্যারাম গ্রহণ করেছেন যা সেট করার পরে আপনি আপনার কনসোলটি গোপন করতে চান (যেমন নিঃশব্দ মোড, ভার্বোস = মিথ্যা)
দ্য লিজেন্ডারিকপি কোডার

3
আপনি যখন আপনার প্রধান নির্বাহযোগ্য ফাইলটিকে পটভূমিতে আপডেট করতে চান এবং তারপরে এটি চালাতে চান এটি দুর্দান্ত। ধন্যবাদ
এহসান

22

আপনি যদি কনসোল নিজেই আড়াল করতে চান তবে কেন আপনার কনসোল অ্যাপ্লিকেশনটির প্রয়োজন? =)

আমি কনসোল অ্যাপ্লিকেশনটির পরিবর্তে উইন্ডোজ অ্যাপ্লিকেশনটিতে প্রজেক্ট আউটপুট টাইপ সেট করার পরামর্শ দিচ্ছি । এটি আপনাকে কনসোল উইন্ডোটি প্রদর্শন করবে না, তবে কনসোল অ্যাপ্লিকেশনের মতো সমস্ত ক্রিয়া সম্পাদন করবে।


28
কারণ এমন একটি সময় আসতে পারে যখন আমি আসলে এটি প্রদর্শন করতে চাই না। পছন্দ করুন, কনসোল অ্যাপ্লিকেশন স্টাফ সম্পাদন করার চেষ্টা করে এবং সফল হিসাবে এটি যেহেতু বিচ্ছিন্ন কাউকে বিরক্ত করে না। যদি তা না হয় তবে এটি পপ আপ হয় এবং আমাকে একটি সি এল এল প্রদান করে।
জ্যানিস এফ

এছাড়াও TopShelfআপনাকে Consolesপরিষেবা হিসাবে চালানোর অনুমতি দেয় এবং এটি ব্রেক হয়ে যায়
মিঃ হিলিস

যদি আপনি চান কনসোলে স্ট্যান্ডার্ড আউট পাওয়া যায়, তবে আপনার কনসোলের দরকার হবে, এটি সাধারণ।
টোটে কার্লসন

20

আপনি বিপরীত কাজ করতে এবং অ্যাপ্লিকেশন আউটপুট প্রকারটি সেট করতে পারেন: উইন্ডোজ অ্যাপ্লিকেশন। তারপরে অ্যাপ্লিকেশনটির শুরুতে এই কোডটি যুক্ত করুন।

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

এই কোড কনসোল প্রদর্শিত হবে showConsoleহয়true


এটি প্রকৃতপক্ষে একটি জ্বলজ্বলে কার্সারের সাহায্যে কনসোলটি দেখায়, তবে কনসোলটিও নয় W রাইটলাইন ("পাঠ্য") বা মানক আউটপুট W রাইটলাইন ("পাঠ্য") আমার ক্ষেত্রে কিছুই দেখায় না। কিছু অনুপস্থিত?
রনি ডি'হুর

9

আমার পোস্টটি এখানে দেখুন:

উইন্ডোজ অ্যাপ্লিকেশনটিতে কনসোল প্রদর্শন করুন

আপনি একটি উইন্ডোজ অ্যাপ্লিকেশন করতে পারেন (উইন্ডোটি সহ বা তার বাইরে) এবং পছন্দসই কনসোলটি প্রদর্শন করতে পারেন। এই পদ্ধতিটি ব্যবহার করে কনসোল উইন্ডোটি কখনই উপস্থিত হয় না যতক্ষণ না আপনি স্পষ্টভাবে এটি প্রদর্শন না করেন। আমি এটি দ্বৈত-মোড অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করি যা আমি কীভাবে কনসোল বা গুই মোডে চালাতে চাই সেগুলি তার উপর নির্ভর করে।


অসাধারণ! কনসোল আড়াল করার সহজ উপায় হ'ল প্রকল্পের ধরণটি উইন্ডোজ অ্যাপ্লিকেশনটিতে পরিবর্তন করা।

4

"কেবল লুকানোর জন্য" আপনি পারবেন:

কনসোল অ্যাপ্লিকেশন থেকে উইন্ডোজ অ্যাপ্লিকেশনে আউটপুট ধরণের পরিবর্তন করুন ,

এবং পরিবর্তে Console.Readline/keyআপনি new ManualResetEvent(false).WaitOne()অ্যাপটি চালিয়ে যেতে শেষে ব্যবহার করতে পারেন ।


1

আপনি যদি উইন্ডো শিরোনামের উপর নির্ভর করতে না চান তবে এটি ব্যবহার করুন:

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

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());

আমাদের DllImport ("ফুলপথ") /
তুষার গুপ্তা - curioustushar

0

যদি আপনার কোনও ছোট ব্যাচের অ্যাপ্লিকেশন সংহত করতে সমস্যা না হয় তবে Cmdow.exe নামে একটি প্রোগ্রাম রয়েছে যা আপনাকে কনসোল শিরোনামের উপর ভিত্তি করে কনসোল উইন্ডোগুলি আড়াল করতে দেয়।

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

সমাধানটিতে এক্সেপ যোগ করুন, "সামগ্রী" এ বিল্ড অ্যাকশন সেট করুন, আপনার উপযুক্ত অনুসারে আউটপুট ডিরেক্টরিতে অনুলিপি সেট করুন এবং সেমিডো যখন চালানো হবে তখন কনসোল উইন্ডোটি আড়াল করবে।

কনসোলটি আবার দৃশ্যমান করতে, আপনি কেবল যুক্তিগুলি পরিবর্তন করুন

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.