0

Windowsフォームアプリケーションでコンソールをエミュレートしようとしています。2 つの余分なスレッドとデリゲートを使用して、複数行のテキスト ボックスを操作できるようにしました。

これはどういうわけか私が物事を非常に複雑にしているようです. だから私の質問。

  1. これを行うより良い方法はありますか?
  2. Enterキーを押してもコマンドが送信されません。最初にもう一度押すと送信されますか? 何故ですか?私はそれをデバッグしようとしましたが、解決策を見つけることができませんでした。

編集!SSH接続を行うためにCsharpSSHを使用しています。また、完全なコードを含めました!

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Tamir.SharpSsh;
    using System.IO;
    using System.Threading;
    using System.Timers;


    namespace WindowsFormsApplication3
    {


    public partial class Form1 : Form
    {

    public string mHost;
    SshShell mShell;
    public string mInput;
    string pattern = "";
    bool mInputHolder = false;
    string mPattern = "";
    int mValue = 0;
    bool mStatus = false;
    private Thread thrdtwo = null;
    private Thread thrdone = null;
    public string mKorv;
    string mString = "";
    delegate void SetTextCallback(string text);
    bool clientopen = true;



    public Form1()
    {
        InitializeComponent();

        txthost.Text = "sdf.org";
        txtuser.Text = "kalle82";
        txtpass.Text = "kattsand";
        string pattern = "sdf:";
        mPattern = pattern;

    }

    public void button1_Click(object sender, EventArgs e)
    {

        mShell = new SshShell(Host, User);
        mShell.Password = Pass;
        //WRITING USER MESSAGE
        txtOutput.AppendText("Connecting...");
        mShell.Connect();
        txtOutput.AppendText("OK");
        mShell.ExpectPattern = mPattern;
        mShell.RemoveTerminalEmulationCharacters = true;
        this.SetText(mShell.Expect(pattern)); 
        txtInput.Focus();

        thrdone = new Thread(new ThreadStart(appengine));
        thrdone.Start();      

    }


    private void appengine()
    {
        this.txtInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(checkforenter);

      //  MessageBox.Show("Appengine started");

        while (mShell.ShellOpened)
        {

            thrdtwo = new Thread(new ThreadStart(startthread2));
            thrdtwo.Start();
            thrdtwo.Join();     


           // this.SetText(mShell.Expect(pattern));
            if (clientopen == false) break;
        }

       // MessageBox.Show("Appengine stopped");

    }



    private void startthread2()
    {

        //Wait for answer
        while (mStatus == false)
        {

        }

    }

    //Recieves keypressevent
    public void checkforenter(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)13)
        {

            mStatus = true;
            mString = txtInput.Text;
            mShell.WriteLine(mString);
            this.SetText(mShell.Expect(pattern));
            txtOutput.AppendText(txtInput.Text + "\n");
        }

        mStatus = false;
    }

    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 (this.txtOutput.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.txtOutput.Text = text.ToString();
        }
    }




    public int checkfortrue()
    {

        if (mInputHolder != true)
        {
            mValue = 0;
        }
        if (mInputHolder == false)
        {
            mValue = -1;
        }
        return mValue;
    }


    public string userInput()
    {
        while (mInputHolder == true)
        {

        }
        mInputHolder = true;
        return txtInput.Text;
    }
    //Properties
    public string Host
    {
        get
        {
            return txthost.Text;
        }
        set
        {
            txthost.Text = value;
        }

    }

    public string User
    {
        get
        {
            return txtuser.Text;
        }
        set
        {
            txtuser.Text = value;
        }

    }

    public string Pass
    {
        get
        {
            return txtpass.Text;
        }
        set
        {
            txtpass.Text = value;
        }

    }

    public string Pattern
    {
        get
        {
            return pattern;
        }

        set
        {
            pattern = value;
        }

    }

    private void button2_Click(object sender, EventArgs e)
    {
        clientopen = false;
    }



}

}
4

0 に答える 0