从另一个进程更新TextBox文本

时间:2012-04-16 09:57:58

标签: c# .net winforms

我有两个WinForms应用程序,我需要从Application2向Application1中的TextBox添加文本。我使用命名管道和WCF成功完成了这项工作。我可以成功地从Application2调用Application1中的方法但是我得到“ Invoke或者BeginInvoke不能在控件上调用,直到窗口句柄被创建。”错误或者文本框没有在所有

这是我的基本代码。 Application2调用GetMessage。这个根本不更新TextBox:

public void GetMessage(string msg)
{
    UpdateTextbox(msg);
}

private void UpdateTextbox(string msg)
{
    this.textBox1.Text += msg + Environment.NewLine;
}

这个抛出Invoke错误:

public void GetMessage(string msg)
{
    Action a = () => UpdateTextbox(msg);
    textBox1.BeginInvoke(a);
}

我试图通过强制创建句柄来欺骗我,但它也没有更新TextBox:

public void GetMessage(string msg)
{
    IntPtr handle = textBox1.Handle;
    Action a = () => UpdateTextbox(msg);
    textBox1.BeginInvoke(a);
}

我该怎么办?

1 个答案:

答案 0 :(得分:2)

感谢this answer解决了这个问题。

问题是Form1的TextBox位于Form1的另一个实例上。观察来自Application1.Form1的代码,该代码启动命名管道服务:

private void Form1_Load(object sender, EventArgs e)
{
    ServiceHost host = new ServiceHost(typeof(Form1), new Uri[] { new Uri("net.pipe://localhost") });
    host.AddServiceEndpoint(typeof(ISmsService), new NetNamedPipeBinding(), "PipeReverse");
    host.Open();
}

如果我理解正确,则会启动Form1的实例。因此,当Application2调用Application1.GetMessage时,它会调用ServiceHost-instance-Form1.GetMessage

要访问Form1的主要实例,我将代码更改为:

public Form1()
{
    InitializeComponent();

    if (mainForm == null)
    {
        mainForm = this;
    }
}

private static Form1 mainForm;
public static Form1 MainForm
{
    get
    {
        return mainForm;
    }
}

private void UpdateTextbox(string msg)
{
    MainForm.textBox1.Text += msg + Environment.NewLine;
}

现在正常运作..