【问题标题】:Updating TextBox text from another process从另一个进程更新 TextBox 文本
【发布时间】:2012-04-27 15:49:46
【问题描述】:

我有两个 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);
}

我该怎么办?

【问题讨论】:

  • 查看this question的答案,可能会有帮助。
  • 如果我理解正确,您有两个不同的应用程序 (exe),并且您正试图从 application2 更改 application1 中的某些内容。如果没有一些进程间通信系统,这是无法完成的。 (WCF,NamedPipes,你已经完成了)
  • Torbjörn: 我试过 textBox1.SafeInvoke(a, false/true);但它不会更新文本框。没有错误,文本框文本保持不变..

标签: c# .net winforms


【解决方案1】:

感谢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;
}

现在可以正常使用了..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多