我有两个 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 answer 解决了问题.
问题是 Form1 的文本框在 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;
}
现在可以正常工作了..
关于c# - 从另一个进程更新 TextBox 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172035/