4

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

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

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

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

这会引发调用错误:

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

我该怎么办?

4

1 回答 1

2

由于这个答案解决了这个问题。

问题是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;
}

它现在可以正常工作..

于 2012-04-17T12:20:11.913 回答