কনসোল লুকানো সহ কীভাবে সি # কনসোল অ্যাপ্লিকেশনটি চালানো যায়


141

কোন কনসোল অ্যাপ্লিকেশন চালানোর সময় কনসোল উইন্ডোটি লুকানোর কোনও উপায় আছে?

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


নির্ধারিত টাস্ক থেকে কনসোল অ্যাপ্লিকেশনটি চালানোর চেষ্টা করুন।

উত্তর:


158

আপনি যদি ProcessStartInfoক্লাসটি ব্যবহার করে থাকেন তবে আপনি উইন্ডো স্টাইলটি গোপনে সেট করতে পারেন - কনসোলের (জিইউআই নয়) অ্যাপ্লিকেশনগুলির ক্ষেত্রে আপনাকে ক্রিয়েটনিও উইন্ডোটি সেট করতে হবে 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

26
আমি যা পোস্ট করতে যাচ্ছিলাম :)
জন স্কিটি

75
পবিত্র বোকা - জোনের চেয়ে দ্রুত কেউ! =)
এরিক ফোর্বস

75
তাকে মারধর করার জন্য আমাকে তার ইন্টারনেট সংযোগ
থ্রোল্ট

11
এটি কোনও কমান্ড লাইন সরঞ্জামের জন্য কাজ করে নি। ব্যবহৃত yourprocess.StartInfo.CreateNoWindow = সত্য; পরিবর্তে, নীচে দেখুন।
খ্রিস্টান

12
কনসোল উইন্ডোটি আড়াল করে না, স্টার্টইনফো.ক্রেটিটনো উইন্ডো = সত্য প্রয়োজন।
ড্যানিয়েল

201

আপনি যদি কনসোল অ্যাপ্লিকেশন লিখে থাকেন তবে আপনি এটি ডিফল্টরূপে গোপন করতে পারেন।

একটি নতুন কনসোল অ্যাপ্লিকেশন তৈরি করুন তারপরে "আউটপুট ধরণ" প্রকারটিকে "উইন্ডোজ অ্যাপ্লিকেশন" তে পরিবর্তন করুন (প্রকল্পের বৈশিষ্ট্যে সম্পন্ন)


6
আমি আমার নিজের কনসোলটি গোপন করার চেষ্টা করছিলাম, অন্য কোনও কল না করে তারপরে এটি আড়াল করলাম (স্বীকৃত উত্তর অনুমানের মতো) - সুতরাং এটি আমার পক্ষে সেরা। ধন্যবাদ!
ইমেসরিয়াস

6
ধন্যবাদ, বন্ধু ! এটিও আমি খুঁজছিলাম!
বরুণ শর্মা

3
গৃহীত উত্তর ধরে নেয় যেহেতু এটি প্রশ্নে বর্ণিত হয়েছে।
অ্যাকোয়া

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

1
প্রসেসস্টার্টআইএনফো নিয়ে এটি আপনার সমস্যার মুখোমুখি হয় যেখানে আপনি ব্যবহারকারীর শংসাপত্রগুলি উল্লেখ করেন এবং সেই ব্যবহারকারী লগ ইন বা বর্তমান ব্যবহারকারী হিসাবে ঘটে। সেই পরিস্থিতিতে ক্রিয়েটনো উইন্ডো সম্পত্তি উপেক্ষা করা হবে যাতে আপনি সর্বদা একটি কনসোল উইন্ডো পান। উইন্ডোজ অ্যাপ্লিকেশনে কনসোল অ্যাপটি সেট করে কিন্তু উইন্ডো ছাড়াই আপনি উইন্ডো পাবেন না।
tjmoore

67

আপনি যদি প্রসেস ক্লাস ব্যবহার করেন তবে লিখতে পারেন

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

আগে yourprocess.start();এবং প্রক্রিয়া লুকানো হবে


4
শুভকামনা যদি আপনাকে এই প্রক্রিয়াটি প্রথম দিকে থামাতে হয়। প্রক্রিয়া.কিল হঠাৎ করেই শেষ হয়। প্রক্রিয়া.ক্লজমাইনউইন্ডো ব্যর্থ। জেনারেটকনসোলসিআরটিএলেন্ট প্রক্রিয়ায় সিটিআরএল + সি বা সিআরটিএল + ব্রেক প্রেরণে ব্যর্থ। প্রক্রিয়াটির সমস্ত থ্রেড উইন্ডোয় WM_CLOSE ব্যর্থ হয়। এই দুটি প্যারামিটার মান দিয়ে শুরু করা কোনও প্রক্রিয়া পরিষ্কারভাবে শেষ করার কোনও উপায় নেই বলে মনে হয়। : এখানে আমার প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/16139571/...
Triynko

ধন্যবাদ টন এটি সবচেয়ে সহজ ছিল। এছাড়াও আপনি যদি কনসোলের কোডটি নিজের (বা ডিপ্ট) করেন তবে আমি এই মুটেক্স উদাহরণটি পরিষ্কার শাটডাউনয়ের পক্ষে সবচেয়ে সহজ বলে খুঁজে পেয়েছি। stackoverflow.com/a/31586184/1877412
cbuteau

1
@ ট্রাইঙ্কো: আপনি কোনও প্রক্রিয়া পরিষ্কারভাবে শেষ করতে পারবেন না, যদি না এই প্রক্রিয়াটি সক্রিয়ভাবে সহযোগিতা করে। এটি পতাকা বা অন্য কোনও বিষয় নয়। ওএসে এমন কোনও কিছুই নেই যা একটি ক্লিন শাটডাউন ট্রিগার করতে পারে। এখানে সাধারণ সমাধানটি হ'ল অপেক্ষাকৃত কার্নেল অবজেক্টটি ব্যবহার করা, যা নিয়ন্ত্রণ প্রক্রিয়াতে সংকেত দেওয়া হয়, যখন স্লেভ প্রক্রিয়াটি সমাপ্ত হয়। স্লেভ প্রক্রিয়াটি সক্রিয়ভাবে এই অপেক্ষাকৃত অবজেক্টের অবস্থা পর্যবেক্ষণ করতে হবে এবং এটি সিগন্যাল হয়ে গেলে পরিষ্কার শাটডাউন শুরু করতে হবে।
IInspectable

43

সহজ উত্তরটি হ'ল: আপনার কনসোল অ্যাপের বৈশিষ্ট্যগুলিতে (প্রকল্পের বৈশিষ্ট্য) যান "" অ্যাপ্লিকেশন "ট্যাবটিতে, কেবল" আউটপুট ধরণ "টিকে "উইন্ডোজ অ্যাপ্লিকেশন" এ পরিবর্তন করুন। এখানেই শেষ.


4
ডার্ট। এটি কোনও উইন্ডোজ অ্যাপ্লিকেশন তৈরির মতো যা কোনও ফর্মকে কল করে না।
ashes999

1
এটা সঠিক উত্তর. আপনার অন্য বান্দাইদ কেউই কাছে যায় না। এটি আসল সঠিক উত্তর। আপনি চান যে আপনার অ্যাপ্লিকেশনটি প্রথম স্থানে কোনও কনসোল না খোল। এছাড়াও, আপনি যে কোনও সময় একটি ফর্ম খুলতে সক্ষম হতে চান। আপনি চাইলে আপনি কেবল ফর্মটি কল করুন। অর্থাত্ যখন সিস্টেম ট্রে আইকনে ব্যবহারকারী ডান ক্লিক করে এবং পছন্দগুলি নির্বাচন করে তখন আমাদের ফর্মটি ডাকা হয়। এটি সঠিক উত্তর!
ব্লুবারন

20

প্রক্রিয়াটি থেকে কনসোলকে আলাদা করতে আপনি ফ্রি কনসোল এপিআই ব্যবহার করতে পারেন :

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

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


আমি কনসোলটি দেখাতে চাইনি। যদিও FreeConsoleচাপলে কি হবে তার নাম বলছেন, এটা কনসোল দেখানোর আগে এটা বলা হয় থেকে Windows বাধা দেয় না।
জেডার ডায়াস

5
তারপরে কনসোল অ্যাপ্লিকেশন নয়, উইন্ডোজ অ্যাপ্লিকেশন হিসাবে প্রকল্পটি সংকলন করুন
টমাস লেভস্ক

1
রেকর্ডের জন্য, এটি আমার প্রয়োজন ঠিক তাই , ধন্যবাদ। এটা তোলে হয় ঠিক কি শিরোনামের জন্য :) জিজ্ঞেস তাই অন্যান্য Google নাবিকদের এই স্বার্থ, + 1-এ
sehe

3
এ ছাড়া [DllImport("kernel32.dll")] static extern bool AllocConsole();আপনাকে একটি স্ট্যান্ডার্ড উইন
32

1
আমার .NET কোর 2.2 অ্যাপের জন্য কাজ করে - যদি কেউ বিশেষত এটি অনুসন্ধান করে থাকে।
মেডিসমাল

7

আপনি যদি আউটপুটটিতে আগ্রহী হন তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

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();
}

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


4

যদি আপনি এমন একটি প্রোগ্রাম তৈরি করেন যা ব্যবহারকারীর ইনপুটটির প্রয়োজন হয় না তবে আপনি সর্বদা এটি পরিষেবা হিসাবে তৈরি করতে পারেন। কোনও পরিষেবা কোনও প্রকারের ইউআই প্রদর্শন করবে না।


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

2

ডিএলএল ফাইল আমদানি করতে এটি আপনার শ্রেণিতে যুক্ত করুন:

[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;

এবং তারপরে আপনি যদি এটি আড়াল করতে চান তবে এই কমান্ডটি ব্যবহার করুন:

 var handle = GetConsoleWindow();
 ShowWindow(handle, SW_HIDE);

এবং আপনি যদি কনসোলটি দেখাতে চান:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

1
[DllImport ("user32.dll")] স্ট্যাটিক এক্সটার্নাল শোল উইন্ডো (ইন্টারপ্রেট এইচডাব্ল্যান্ড, এনসিএমডি শো); [DllImport ("kernel32.dll")] স্ট্যাটিক এক্সটার্নার ইন্টারপ্রেট গেটকনসোল উইন্ডো (); কনট ইনট SW_HIDE = 0; কনট ইনট SW_SHOW = 5;
সোলম্যাচাইন

1

আমি জানি আপনি যা চান ঠিক তার উত্তর দিচ্ছি না, তবে আপনি যদি সঠিক প্রশ্ন জিজ্ঞাসা করছেন তবে আমি ভাবছি।

আপনি কেন ব্যবহার করবেন না:

  1. উইন্ডোজ পরিষেবা
  2. একটি নতুন থ্রেড তৈরি করুন এবং এটিতে আপনার প্রক্রিয়াটি চালান

আপনার শব্দগুলি যদি কোনও প্রক্রিয়া চালাতে চায় তবে আরও ভাল বিকল্পগুলির মতো সেই শব্দগুলি।


3
প্রচুর পরিস্থিতি রয়েছে যেখানে ইউটিলিটি কনসোল অ্যাপ্লিকেশন চালু করা পুরোপুরি বৈধ।
অ্যাডাম রবিনসন

আমার ক্ষেত্রে যে সফ্টওয়্যারটি আমি ব্যবহার করছি তার মধ্যে ক্লায়েন্ট / সার্ভার মডেলটির কারণে একটি পৃথক প্রক্রিয়া প্রয়োজন।
অ্যারন থমাস

এটি একটি নতুন থ্রেড তৈরি করতে সর্বদা সমস্যার সমাধান করে না। এমন সময় আছে যখন আপনি ব্যাকগ্রাউন্ডে কেবল বিরক্তিকর উইন্ডোটি চান না। এছাড়াও, যদি আপনার কোনও প্রসেস থাকে a লুপটিতে স্টার্ট করুন, তবে কনসোল উইন্ডোজ আপনার মুখের মধ্যে পপ আপ হিসাবে কোনও কাজ শেষ করতে পারবেন না।
ব্যবহারকারী 890332

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

1

যদিও এখানে অন্যান্য উত্তরগুলি বলেছে আপনি "আউটপুট ধরণ" কে "উইন্ডোজ অ্যাপ্লিকেশন" এ পরিবর্তন করতে পারেন তবে দয়া করে সচেতন হন যে এর অর্থ হ'ল আপনি ব্যবহার করতে পারবেন না Console.In হ'ল আপনি এটি যেহেতু এটি নল স্ট্রিমরেডার হয়ে যাবে।

Console.Outএবং Console.Errorএখনও ঠিক কাজ করা বলে মনে হচ্ছে।


2
আপনি গুরুতর? কেন Console.Inকোনও কিছু ইনপুট করার জন্য কনসোল না থাকলে কেউ কেন ব্যবহার করবে ? যেখান থেকে কিছু আসা উচিত সেখানে দিয়ে অ্যাক্সেস করা যেতে পারে Console.In? এটি মোটেই কোনও মানে করে না। অন্য কথায়: এটা যে সম্পূর্ণই সুস্পষ্ট এবং যৌক্তিক Console.Inএকটি হল NullStreamReaderএই ক্ষেত্রে।
রবার্ট এস।

1
@RobertS। একটি পাইপ সম্ভবত। অর্থাৎ অন্য প্রোগ্রামের আউটপুট। এটি আমার ব্যবহারের ঘটনা যখন আমি এটি আবিষ্কার করি।
kjbartel

1

উপরের অ্যাডাম মার্কোভিটসের উত্তরের ভিত্তিতে, নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছে:

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();

1

আমি ভাগ করার একটি সাধারণ সমাধান পেয়েছি:

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);
        }
    }
}

এই প্রকল্পটিকে কেবল আপনার প্রকল্পে অন্তর্ভুক্ত করুন এবং কল করুন Magician.DisappearConsole();

আপনি যখন ক্লিক করে প্রোগ্রামটি শুরু করবেন তখন একটি কনসোল ফ্ল্যাশ হবে। কমান্ড প্রম্পট থেকে কার্যকর করার সময়, কমান্ড প্রম্পট কার্যকর হওয়ার খুব শীঘ্রই অদৃশ্য হয়ে যায়।

আমি এটি একটি ডিসকর্ড বটের জন্য করি যা আমার কম্পিউটারের পটভূমিতে একটি অদৃশ্য প্রক্রিয়া হিসাবে চিরকাল চলে। আমার পক্ষে টপশেলফ কাজ করার চেয়ে সহজ ছিল। একটি দম্পতি টপসেল্ফ টিউটোরিয়াল আমাকে ব্যর্থ করেছিল অন্য কোথাও খুঁজে পাওয়া কোডের সাহায্যে এটি লেখার আগে। ; p

আমি কনসোল অ্যাপ্লিকেশনটির পরিবর্তে উইন্ডোজ অ্যাপ্লিকেশন হিসাবে চালু করার জন্য ভিজ্যুয়াল স্টুডিও> প্রকল্প> বৈশিষ্ট্য> অ্যাপ্লিকেশন এর সেটিংস পরিবর্তন করার চেষ্টা করেছি এবং আমার প্রকল্প সম্পর্কে কিছু এটিকে আমার কনসোলটি আড়াল করা থেকে বিরত করেছিল - কারণ ডিএসআরপপ্লাস স্টার্টআপে কনসোল চালু করার দাবি করেছে । আমি জানি না। কারণ যাই হোক না কেন, এই শ্রেণিটি পপ আপ হওয়ার পরে সহজেই কনসোলটি মেরে ফেলার অনুমতি দেয়।

আশা করি এই যাদুকর কাউকে সাহায্য করবে। ;)


0

শুধু লেখো

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

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