আমি কীভাবে একটি ফর্ম অ্যাপ্লিকেশনটিতে কনসোল আউটপুট / উইন্ডো দেখাব?


131

সরাসরি অবধি আটকা পড়ার জন্য একটি খুব প্রাথমিক উদাহরণ:

using System;
using System.Windows.Forms;

class test
{ 
    static void Main()
    { 
        Console.WriteLine("test");
        MessageBox.Show("test");
    }
}

যদি আমি এটি পূর্বনির্ধারিত বিকল্পগুলি (কমান্ড লাইনে সিএসসি ব্যবহার করে) সংকলন করি, তবে এটি একটি কনসোল অ্যাপ্লিকেশনকে সংকলন করবে। এছাড়াও, যেহেতু আমি আমদানি করেছি System.Windows.Forms, এটি একটি বার্তা বাক্সও প্রদর্শন করবে।

এখন, আমি যদি অপশনটি ব্যবহার /target:winexeকরি, যা আমার মনে হয় Windows Applicationপ্রকল্প বিকল্পগুলির মধ্যে থেকে পছন্দ করা সমান , যেমনটি প্রত্যাশিত আমি কেবল বার্তা বাক্স এবং কোনও কনসোল আউটপুট দেখতে পাব।

(আসলে, কমান্ড লাইন থেকে এটি চালু হওয়ার মুহুর্তে, অ্যাপ্লিকেশনটি সম্পূর্ণ হওয়ার আগেই আমি পরবর্তী আদেশটি জারি করতে পারি)।

সুতরাং, আমার প্রশ্নটি - আমি জানি যে আপনি কনসোল অ্যাপ্লিকেশন থেকে "উইন্ডোজ" / ফর্ম আউটপুট পেতে পারেন, তবে উইন্ডোজ অ্যাপ্লিকেশন থেকে কনসোলটি দেখানোর জন্য কি কোনও উপায় আছে?


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

7
@ ডগেট, সরল - আমি শিখছি এবং কেন / কীভাবে করব তা বুঝতে চাইছি, এমনকি যদি আমি কখনই এটি বাস্তব প্রয়োগে ব্যবহার না করি .... এই মুহুর্তে, আমি এমন একটি বিকল্পের কথা ভাবছি যা অতিরিক্ত কমান্ড দেয় / আউটপুট যেমন ভিএলসিতে, তবে টিবিএইচ, আমার এটির দরকার নেই - আবার, কেবল শিখছি এবং এটি বুঝতে চাই!
উইল

আমি এই টিউটোরিয়ালটি ব্যবহার করে তা সম্পাদন করেছি: saezndaree.wordpress.com/2009/03/29/…
ভিভানভ

উত্তর:


153

এই এক কাজ করা উচিত।

using System.Runtime.InteropServices;

private void Form1_Load(object sender, EventArgs e)
{
    AllocConsole();
}

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();

8
আশ্চর্যজনক, এই প্রশ্নটি অনেকগুলি জিজ্ঞাসা করা হয়েছে বলে মনে হচ্ছে, আমি যে প্রশ্নের সন্ধান করতে পেরেছি তার একমাত্র আসল উত্তর, +1
রব জনসন

5
মূল সমস্যা: আপনি যখন এটি বন্ধ করেন, সমস্ত অ্যাপ্লিকেশন বন্ধ হয়ে যায়।
চিহ্নিত করুন

4
আমি উইন্ডোজ 8 এবং উইন্ডোজ 10 এ পরীক্ষা করেছি: - অ্যাটাচ কনসোল একটি সেন্টিমিডি বাক্স থেকে কাজ করে - অলোকসনসুল ভিজ্যুয়াল স্টুডিও থেকে কাজ করে। যখন বরাদ্দ প্রয়োজন হয়, অ্যাটাচ কনসোল মিথ্যা ফিরিয়ে দেয়। কনসোল মোডে অ্যাপ্লিকেশনটি শেষ করার আগে আপনার ফ্রি কনসোল () কল করা উচিত। আমার প্রোগ্রামে আমি ম্যাথিউ স্ট্রব্রিজের কোড ব্যবহার করেছি (নীচে দেখুন) অ্যাটাচ কনসোল () লাইনটি এতে পরিবর্তিত হয়েছে: যদি (! AttachConsole (-1)) AllocConsole ();
বেরেন্ড এঞ্জেলব্রেচট

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

2
এটি দুর্দান্ত নয়, কমান্ড লাইন থেকে চালিত হলে এটি পৃথক কনসোল উইন্ডোটি খুলবে এবং কমান্ড লাইন থেকে চলার সময় এবং >আউটপুট পুনর্নির্দেশের জন্য ব্যবহার করার চেষ্টা করার সময় আমি আমার ফাইলটিতে একটি পৃথক কনসোল উইন্ডো এবং শূন্য আউটপুট পাই।
uglycoyote

139

সম্ভবত এটি অতি-সরলবাদী ...

একটি উইন্ডোজ ফর্ম প্রকল্প তৈরি করুন ...

তারপরে: প্রকল্পের বৈশিষ্ট্য -> অ্যাপ্লিকেশন -> আউটপুট ধরণ -> কনসোল অ্যাপ্লিকেশন

তারপরে কনসোল এবং ফর্মগুলি এক সাথে চলতে পারে, আমার পক্ষে কাজ করে


2
সহজ বলে মনে হচ্ছে, আমার সমস্যাটিও ঠিক করে দেওয়া হয়েছে।
dadude999

2
এটি অবশ্যই সেরা সমাধান! অন্যেরা স্মার্ট কিন্তু উপায় জটিল
এলএম.ক্রয়েজ

3
সাধারণ এবং সূক্ষ্ম কাজ। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
madu

7
যদিও, হ্যাঁ, প্রযুক্তিগতভাবে এটি পোস্টার যা চাইছে তা অনুমতি দেওয়ার জন্য ব্যবহার করা যেতে পারে - এটি কোনও দুর্দান্ত সমাধান নয় not এটি করার মাধ্যমে, আপনি যদি তারপর জিইউআই দিয়ে আপনার উইনফর্মস অ্যাপ্লিকেশনটি শুরু করেন - আপনি একটি কনসোল উইন্ডোও খোলা পাবেন। এই ক্ষেত্রে, আপনার কাছে মাইক ডি ক্লার্কের উত্তরের মতো আরও কিছু প্রয়োজন হবে।
জাস্টিন গ্রেয়ল্ফ

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

63

আপনি যদি অন-কমান্ড কনসোল খোলার বিষয়ে উদ্বিগ্ন না হন তবে আপনি আপনার প্রকল্পের বৈশিষ্ট্যগুলিতে যেতে পারেন এবং এটি কনসোল অ্যাপ্লিকেশনটিতে পরিবর্তন করতে পারেন

প্রকল্পের ধরণ পরিবর্তন করার স্ক্রিনশট

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

আপনি প্রোগ্রামটি স্থাপনের আগে কেবল এটি ফিরিয়ে দেওয়ার কথা মনে রাখবেন।


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

2
@ জেসনহরিসন আপনি কনসোল উইন্ডোটি বন্ধ করে দিলে প্রোগ্রামটি বন্ধ হয়ে যায়। এছাড়াও প্রোগ্রামটি চলাকালীন উইন্ডোটি সর্বদা খোলা থাকে।
gunr2171

2
@ বন্দুক 2171: ধন্যবাদ এই পদ্ধতির ডাউনসাইডগুলি উত্তরে উল্লেখ করা হয়েছে: অ্যাপ্লিকেশনটি ডাবল ক্লিক, স্টার্ট মেনু ইত্যাদির সাহায্যে চালু করা হলে কনসোল উইন্ডো উপস্থিত হবে
জেসন হ্যারিসন

17

AttachConsoleউইনফর্মস প্রকল্পের সাথে সংযুক্ত কনসোল উইন্ডোটি পেতে আপনি পিনভোক ব্যবহার করে কল করতে পারেন : http://www.csharp411.com/console-output-from-winforms-application/

আপনি বিভিন্ন কনফিগারেশনে লগ আউটপুট কনফিগার করার জন্য লগ 4 নেট ( http://logging.apache.org/log4net/index.html ) বিবেচনা করতে চাইতে পারেন ।


+1 - বাহ, আমি একটি কনসোল.শো বা অনুরূপ আশা করছিলাম! আমার চেয়ে অনেক জটিল! এর চেয়ে আরও ভাল / সহজ উত্তর থাকলে আমি এই মুহুর্তের জন্য উন্মুক্ত রেখে দেব।
Wil

এটি আমার জন্য কাজ করেছে, অলোকসনসোল () এটি নতুন কনসোল উইন্ডো তৈরি করার কারণে হয়নি (অলোকসনসুলে আরও খনন করেনি, যদিও আমি সেখানে কিছু মিস করেছি)।
derFunk

14

এটি আমার জন্য কাজ করেছিল, কোনও ফাইলে আউটপুট পাইপ করতে। কনসোল দিয়ে কল করুন

সেমিডি / সি "সি: \ পাথ \ থেকে \ আপনার \ অ্যাপ্লিকেশন.এক্সই"> মাইফাইল.txt

আপনার আবেদনে এই কোডটি যুক্ত করুন।

    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(UInt32 dwProcessId);
    [DllImport("kernel32.dll")]
    private static extern bool GetFileInformationByHandle(
        SafeFileHandle hFile,
        out BY_HANDLE_FILE_INFORMATION lpFileInformation
        );
    [DllImport("kernel32.dll")]
    private static extern SafeFileHandle GetStdHandle(UInt32 nStdHandle);
    [DllImport("kernel32.dll")]
    private static extern bool SetStdHandle(UInt32 nStdHandle, SafeFileHandle hHandle);
    [DllImport("kernel32.dll")]
    private static extern bool DuplicateHandle(
        IntPtr hSourceProcessHandle,
        SafeFileHandle hSourceHandle,
        IntPtr hTargetProcessHandle,
        out SafeFileHandle lpTargetHandle,
        UInt32 dwDesiredAccess,
        Boolean bInheritHandle,
        UInt32 dwOptions
        );
    private const UInt32 ATTACH_PARENT_PROCESS = 0xFFFFFFFF;
    private const UInt32 STD_OUTPUT_HANDLE = 0xFFFFFFF5;
    private const UInt32 STD_ERROR_HANDLE = 0xFFFFFFF4;
    private const UInt32 DUPLICATE_SAME_ACCESS = 2;
    struct BY_HANDLE_FILE_INFORMATION
    {
        public UInt32 FileAttributes;
        public System.Runtime.InteropServices.ComTypes.FILETIME CreationTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastWriteTime;
        public UInt32 VolumeSerialNumber;
        public UInt32 FileSizeHigh;
        public UInt32 FileSizeLow;
        public UInt32 NumberOfLinks;
        public UInt32 FileIndexHigh;
        public UInt32 FileIndexLow;
    }
    static void InitConsoleHandles()
    {
        SafeFileHandle hStdOut, hStdErr, hStdOutDup, hStdErrDup;
        BY_HANDLE_FILE_INFORMATION bhfi;
        hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        hStdErr = GetStdHandle(STD_ERROR_HANDLE);
        // Get current process handle
        IntPtr hProcess = Process.GetCurrentProcess().Handle;
        // Duplicate Stdout handle to save initial value
        DuplicateHandle(hProcess, hStdOut, hProcess, out hStdOutDup,
        0, true, DUPLICATE_SAME_ACCESS);
        // Duplicate Stderr handle to save initial value
        DuplicateHandle(hProcess, hStdErr, hProcess, out hStdErrDup,
        0, true, DUPLICATE_SAME_ACCESS);
        // Attach to console window – this may modify the standard handles
        AttachConsole(ATTACH_PARENT_PROCESS);
        // Adjust the standard handles
        if (GetFileInformationByHandle(GetStdHandle(STD_OUTPUT_HANDLE), out bhfi))
        {
            SetStdHandle(STD_OUTPUT_HANDLE, hStdOutDup);
        }
        else
        {
            SetStdHandle(STD_OUTPUT_HANDLE, hStdOut);
        }
        if (GetFileInformationByHandle(GetStdHandle(STD_ERROR_HANDLE), out bhfi))
        {
            SetStdHandle(STD_ERROR_HANDLE, hStdErrDup);
        }
        else
        {
            SetStdHandle(STD_ERROR_HANDLE, hStdErr);
        }
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        // initialize console handles
        InitConsoleHandles();

        if (args.Length != 0)
        {

            if (args[0].Equals("waitfordebugger"))
            {
                MessageBox.Show("Attach the debugger now");
            }
            if (args[0].Equals("version"))
            {
#if DEBUG
                String typeOfBuild = "d";
#else
                String typeOfBuild = "r";
#endif
                String output = typeOfBuild + Assembly.GetExecutingAssembly()
                    .GetName().Version.ToString();
                //Just for the fun of it
                Console.Write(output);
                Console.Beep(4000, 100);
                Console.Beep(2000, 100);
                Console.Beep(1000, 100);
                Console.Beep(8000, 100);
                return;
            }
        }
    }

আমি এই কোডটি এখানে পেয়েছি: http://www.csharp411.com/console-output-from-winforms-application/ আমার মনে হয়েছে এটি এখানে পোস্ট করার উপযুক্তও ছিল।


5
এটি দুর্দান্ত কাজ ছাড়াই এটি এখন উইন্ডোজ 8 এবং উইন্ডোজ 10 এ ব্যর্থ হয়েছে ব্যর্থতার দ্বারা আমি বলতে চাইছি অতিরিক্ত প্রম্পট ব্যতীত আর কোনও আউটপুট নেই (যদি এটি কোনও চিহ্ন থাকে) ।সোনোন অলোকসনলের পরামর্শ দিয়েছিল তবে এটি কেবল একটি সেন্টিমিডি উইন্ডোটি ফ্ল্যাশ করেছে।
সাইমন হেফার

উপরের চাজের উত্তরও চেষ্টা করে দেখেছেন তবে এটি উইন্ডোজ in এ একটি নতুন কনসোল দেয় (যদিও এটি 8 বা 10 তে নয়)। আমার কেবল কমান্ড লাইনে পুনঃনির্দেশের সাথে চালানোর বিকল্প বা গিগী হিসাবে চালানো বিকল্প নেই যদি কোনও আরগস না থাকে।
সাইমন হেফার

আমি এই চেষ্টা করেছিলাম কিন্তু কাজ হয়নি। কেবলমাত্র AttachConsole(ATTACH_PARENT_PROCESS)আমি কনসোল আউটপুট পাব কিন্তু এটি কমান্ড লাইনে পুনর্নির্দেশ >কাজ করে না। যখন আমি এই উত্তরটি চেষ্টা করি, কনসোলে বা কোনও ফাইলে আমি কোনও আউটপুট পেতে পারি না।
uglycoyote

12

এখানে মূলত দুটি জিনিস ঘটতে পারে।

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

কমান্ড সিনট্যাক্স শুরু করার লিঙ্ক

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

yourapp> file.txt

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

// This always writes to the parent console window and also to a redirected stdout if there is one.
// It would be better to do the relevant thing (eg write to the redirected file if there is one, otherwise
// write to the console) but it doesn't seem possible.
public class GUIConsoleWriter : IConsoleWriter
{
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AttachConsole(int dwProcessId);

    private const int ATTACH_PARENT_PROCESS = -1;

    StreamWriter _stdOutWriter;

    // this must be called early in the program
    public GUIConsoleWriter()
    {
        // this needs to happen before attachconsole.
        // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere
        // I guess it probably does write somewhere, but nowhere I can find out about
        var stdout = Console.OpenStandardOutput();
        _stdOutWriter = new StreamWriter(stdout);
        _stdOutWriter.AutoFlush = true;

        AttachConsole(ATTACH_PARENT_PROCESS);
    }

    public void WriteLine(string line)
    {
        _stdOutWriter.WriteLine(line);
        Console.WriteLine(line);
    }
}

আমি কনসোলটিতে লিখতে পারিনি; অভিভাবক প্রক্রিয়া সংযুক্তি প্রথমে কৌশলটি করেছিল। ধন্যবাদ.
পিপ্প

দেখে মনে হচ্ছে এই উত্তরের জন্য আপনাকে উপরে বর্ণিত Console.WriteLineনতুন WriteLineসংজ্ঞায়িত কল করার জন্য সমস্ত কল পুনর্লিখন করতে হবে । তবুও আমি চেষ্টা করেছি যে কমান্ড লাইনে অ্যাপ্লিকেশনটি চালিত করার সময় এবং কোনও ফাইলের সাথে পুনর্নির্দেশের সময় আমি এই কোডটি কোনও ফাইলে পুনঃনির্দেশিত করার জন্য এই কোডটি দিয়ে অক্ষম >
uglycoyote

@uglycoyote, আপনার অ্যাপ্লিকেশনটিতে আপনি যত তাড়াতাড়ি সম্ভব GUIConsoleWriter নির্মাণ করছেন তা নিশ্চিত করুন, অন্যথায় এটি রহস্যজনক উইন্ডোজ ধরণের কারণে কাজ করবে না। আমি তর্ক করব যে কলগুলিতে কল করা Console.WriteLineকেবল একটি ভাল অনুশীলন, এটি আপনাকে পরীক্ষা করার অনুমতি দেয় এবং আপনি যে জায়গাগুলিতে লগইন করেন তা সহজেই পরিবর্তন করতে পারে (উদাহরণস্বরূপ, আপনি হয়ত পেপারট্রাইলের মতো ক্লাউড ভিত্তিক লগিং সার্ভিসে লগইন শুরু করতে চাইতে পারেন বা যা কিছু )
সিড করুন

এটি আমার জন্য এমনকি উইন 10 এ দুর্দান্ত কাজ করেছেStreamWriter _stdOutWriter;
টিএস

পাইপিং উত্তর, তবে কোনও ফাইলের পরিবর্তে কেবল আরও ব্যবহার করুন, যেমন: ইউর্যাপ | আরও দয়া করে স্ট্যাকওভারফ্লো.com
রোল্যান্ড

9

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

এটি কনসোল এবং ফর্ম উভয়ই খোলার ফলস্বরূপ ।

এখানে চিত্র বর্ণনা লিখুন


আমি ঠিক এটিই সন্ধান করছি। সহজ এবং WINAPI এর ব্যবহার না করে।
মাইকেল কক্সন

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

4
//From your application set the Console to write to your RichTextkBox 
//object:
Console.SetOut(new RichTextBoxWriter(yourRichTextBox));

//To ensure that your RichTextBox object is scrolled down when its text is 
//changed add this event:
private void yourRichTextBox_TextChanged(object sender, EventArgs e)
{
    yourRichTextBox.SelectionStart = yourRichTextBox.Text.Length;
    yourRichTextBox.ScrollToCaret();
}

public delegate void StringArgReturningVoidDelegate(string text);
public class RichTextBoxWriter : TextWriter
{
    private readonly RichTextBox _richTextBox;
    public RichTextBoxWriter(RichTextBox richTexttbox)
    {
        _richTextBox = richTexttbox;
    }

    public override void Write(char value)
    {
        SetText(value.ToString());
    }

    public override void Write(string value)
    {
        SetText(value);
    }

    public override void WriteLine(char value)
    {
        SetText(value + Environment.NewLine);
    }

    public override void WriteLine(string value)
    {
        SetText(value + Environment.NewLine);
    }

    public override Encoding Encoding => Encoding.ASCII;

    //Write to your UI object in thread safe way:
    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the  
        // calling thread to the thread ID of the creating thread.  
        // If these threads are different, it returns true.  
        if (_richTextBox.InvokeRequired)
        {
            var d = new StringArgReturningVoidDelegate(SetText);
            _richTextBox.Invoke(d, text);
        }
        else
        {
            _richTextBox.Text += text;
        }
    }
}

3
using System;
using System.Runtime.InteropServices;

namespace SomeProject
{
    class GuiRedirect
    {
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetStdHandle(StandardHandle nStdHandle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetStdHandle(StandardHandle nStdHandle, IntPtr handle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern FileType GetFileType(IntPtr handle);

    private enum StandardHandle : uint
    {
        Input = unchecked((uint)-10),
        Output = unchecked((uint)-11),
        Error = unchecked((uint)-12)
    }

    private enum FileType : uint
    {
        Unknown = 0x0000,
        Disk = 0x0001,
        Char = 0x0002,
        Pipe = 0x0003
    }

    private static bool IsRedirected(IntPtr handle)
    {
        FileType fileType = GetFileType(handle);

        return (fileType == FileType.Disk) || (fileType == FileType.Pipe);
    }

    public static void Redirect()
    {
        if (IsRedirected(GetStdHandle(StandardHandle.Output)))
        {
            var initialiseOut = Console.Out;
        }

        bool errorRedirected = IsRedirected(GetStdHandle(StandardHandle.Error));
        if (errorRedirected)
        {
            var initialiseError = Console.Error;
        }

        AttachConsole(-1);

        if (!errorRedirected)
            SetStdHandle(StandardHandle.Error, GetStdHandle(StandardHandle.Output));
    }
}

1
কমান্ড প্রম্পট থেকে সূক্ষ্ম কাজ করে তবে শুরু> চালানো বা ভিজ্যুয়াল স্টুডিওতে নয়। এটিকে সব ক্ষেত্রে কাজ করার জন্য, অ্যাটাচ কনসোল লাইনটি প্রতিস্থাপন করুন: যদি (! AttachConsole (-1)) AllocConsole (); যদি অলোকসনসোল () বলা হয়, ফ্রি কনসোল () কেও কল করা উচিত, অন্যথায় কনসোল হোস্ট প্রোগ্রামটি শেষ করে চলতে থাকে।
বেরেন্ড এঞ্জেলব্রেচট

2
ইনিশিয়ালিসটআউট এবং ইনিশিয়ালিসররের উদ্দেশ্য কী ব্যবহার করা হয়, কারণ সেগুলি ব্যবহৃত হয় না?
এডউইন

StandardHandle : uintএখানে ভুল ... X86 এবং x64 উভয় ক্ষেত্রেই কাজ করতে ইন্টারপ্রেট হওয়া উচিত
দিমিত্রি গুসারভ

1

কনসোল বা উইন্ডোতে আপনি যে কোনও সময় অ্যাপ্লিকেশনগুলির ধরণের মধ্যে স্যুইচ করতে পারেন। সুতরাং, আপনি stdout দেখতে বিশেষ যুক্তি লিখবেন না। এছাড়াও, ডিবাগারে অ্যাপ্লিকেশন চলাকালীন, আপনি আউটপুট উইন্ডোতে সমস্ত স্টাডআউট দেখতে পাবেন। আপনি কেবল একটি ব্রেকপয়েন্টও যোগ করতে পারেন এবং ব্রেকপয়েন্ট পয়েন্টে "হিট হিট ..." পরিবর্তন করার পরে আপনি কোনও বার্তা এবং ভেরিয়েবল আউটপুট করতে পারেন। এছাড়াও আপনি "চালিয়ে যাওয়া চালিয়ে যাওয়া চালিয়ে যান" পরীক্ষা করতে / চেক করতে পারেন এবং আপনার ব্রেকপয়েন্টটি বর্গাকার আকারের হয়ে উঠবে। সুতরাং, ডিবাগ আউটপুট উইন্ডোটিতে অ্যাপ্লিকেশনটিতে কিছু পরিবর্তন না করে ব্রেকপয়েন্ট বার্তা।


0

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


2
হ্যালো এবং স্ট্যাকওভারফ্লোতে স্বাগতম, উত্তর হিসাবে প্রশ্ন পোস্ট করা এড়ানো, মন্তব্য বিভাগটি ব্যবহার করুন।
পেড্রো রডরিগস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.