كيفية إرسال الإدخال إلى وحدة التحكم كما لو كان المستخدم يكتب؟

StackOverflow https://stackoverflow.com/questions/451228

  •  19-08-2019
  •  | 
  •  

سؤال

هذه مشكلتي. لديّ برنامج يجب أن يعمل في tty ، يوفر Cygwin هذا tty. عندما أقوم بإعادة توجيه stdin فشل البرنامج لأنه لا يحتوي على tty. لا يمكنني تعديل هذا البرنامج ، وأحتاج إلى طريقة لأتمتة ذلك.

كيف يمكنني الحصول على نافذة cmd.exe وإرسال البيانات وجعلها تعتقد أن المستخدم يكتبها؟

أنا أستخدم C# ، وأعتقد أن هناك طريقة للقيام بذلك مع Java.awt.robot ولكن يجب أن أستخدم C# لأسباب أخرى.

هل كانت مفيدة؟

المحلول

هذا يبدو وكأنه مهمة ل SendKeys(). إنه ليس C#، ولكن vbscript ، ولكن مع ذلك - لقد طلبت ذلك بعض طريقة أتمتة:

Set Shell = CreateObject("WScript.Shell")

Shell.Run "cmd.exe /k title RemoteControlShell"
WScript.Sleep 250

Shell.AppActivate "RemoteControlShell"
WScript.Sleep 250

Shell.SendKeys "dir{ENTER}"

نصائح أخرى

لقد اكتشفت كيفية إرسال المدخلات إلى وحدة التحكم. لقد استخدمت ما قاله جون سكيت. لست متأكدًا بنسبة 100 ٪ هذه هي الطريقة الصحيحة لتنفيذ هذا.

إذا كان هناك أي تعليقات لجعل هذا أفضل أحب هنا. فعلت هذا فقط لمعرفة ما إذا كان بإمكاني معرفة ذلك.

إليكم البرنامج الذي حدقت في انتظار إدخال المستخدم للمستخدم

class Program
{
    static void Main(string[] args)
    {
        // This is needed to wait for the other process to wire up.
        System.Threading.Thread.Sleep(2000);

        Console.WriteLine("Enter Pharse: ");

        string pharse = Console.ReadLine();

        Console.WriteLine("The password is '{0}'", pharse);


        Console.WriteLine("Press any key to exit. . .");
        string lastLine = Console.ReadLine();

        Console.WriteLine("Last Line is: '{0}'", lastLine);
    }
}

هذا هو تطبيق وحدة التحكم إلى الآخر

class Program
{
    static void Main(string[] args)
    {
        // Find the path of the Console to start
        string readFilePath = System.IO.Path.GetFullPath(@"..\..\..\ReadingConsole\bin\Debug\ReadingConsole.exe");

        ProcessStartInfo startInfo = new ProcessStartInfo(readFilePath);

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardInput = true;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;

        Process readProcess = new Process();
        readProcess.StartInfo = startInfo;

        // This is the key to send data to the server that I found
        readProcess.OutputDataReceived += new DataReceivedEventHandler(readProcess_OutputDataReceived);

        // Start the process
        readProcess.Start();

        readProcess.BeginOutputReadLine();

        // Wait for other process to spin up
        System.Threading.Thread.Sleep(5000);

        // Send Hello World
        readProcess.StandardInput.WriteLine("Hello World");

        readProcess.StandardInput.WriteLine("Exit");

        readProcess.WaitForExit();
    }

    static void readProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        // Write what was sent in the event
        Console.WriteLine("Data Recieved at {1}: {0}", e.Data, DateTime.UtcNow.Ticks);
    }
}

هل يمكنك بدء تشغيل البرنامج (أو cygwin) داخل الكود الخاص بك ، باستخدام ProcessStartInfo.RedirectStandardInput (والإخراج/الخطأ) للتحكم في تدفق البيانات؟

لقد واجهت مشكلة مماثلة منذ بعض الوقت ، يجب على Cygwin كتابة بعض المعلومات المفيدة (دقة وظيفة cygwin ، نص الخطأ ورمز الخطأ winapi) إلى دفق الخطأ ، يجب عليك إعادة توجيهها في مكان ما وقراءة ما يكتبه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top