如何将字符串从一个 winform 应用程序发送到另一个应用程序? [复制]

Posted

技术标签:

【中文标题】如何将字符串从一个 winform 应用程序发送到另一个应用程序? [复制]【英文标题】:How do I Send strings from one winform app to another? [duplicate] 【发布时间】:2019-10-30 00:45:08 【问题描述】:

我正在尝试为应用程序创建一个函数,但首先在测试应用程序中进行了尝试。基本上,当用户按下绿色按钮时,我有一个带有三个按钮的应用程序,我希望该按钮将字符串发送到另一个正在显示图像的应用程序。此应用程序将读取字符串并显示绿色图像。将字符串数据从一个应用程序发送到另一个应用程序的最佳方式是什么?

我已经研究了多种进行应用程序通信的方式,但我没有找到一个很好的解释

【问题讨论】:

看看:***.com/questions/1802475/… 如果你还没有看过,你想搜索一下Interprocess Communication 好的,谢谢,我试试 【参考方案1】:

我提出了一种不同的方法来让应用程序通信(在这种情况下,它是一种在途交互:只有一个应用程序与另一个应用程序通信)。

使用 UI 自动化,您可以在另一个应用程序中以半透明的方式获取或设置控件属性的值。还接收或引发事件,检测应用程序何时运行或关闭其他有趣的活动。此处的一般文档:

Windows Accessibility API reference - UI Automation.Net Framework UI Automation Fundamentals

您有两个具有简单需求的简单应用程序,因此这项任务非常简单:

一个应用程序等待命令(或者它就在那里)。 另一个应用程序发送第一个应用程序需要解释和执行的命令。

由于您需要发送一些字符串来改变 PictureBox 的颜色,我们可以使用 TextBox 控件来接收字符串并将 命令 转换为 Color 或触发另一个预定义的行为.

使用 UI 自动化,两个应用程序可以独立运行,然后以不同的方式确认其他应用程序的存在。例如,使用WindowPattern.WindowOpenedEvent,我们可以检测应用程序何时运行并以不同的方式确定它是否有趣。有关实施,请参阅以下问题:

Run event when any Form loads 另一个问题,发给identify an application based on the content of a child control。

在这里(为了简短起见),我只是列举了正在运行的具有接口的应用程序,并使用 ComboBox 作为选择器来选择一个。

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)

    var window = AutomationElement.FromHandle((IntPtr)comboBox1.SelectedValue);
    if (window != null) 
        GetCommElement(window, ControlType.Edit);
    


private void GetCommElement(AutomationElement parent, ControlType controlType)

    element = parent.FindFirst(TreeScope.Subtree, 
        new PropertyCondition(AutomationElement.ControlTypeProperty, controlType));

如果找到所选应用程序的 TextBox,我们将获取其 ValuePattern(允许设置控件值的 UI 自动化模式)并将其 Text 属性设置为对应于颜色名称的字符串: (请注意,只有非多行编辑控件(WinForms TextBox)支持ValuePattern。多行编辑控件不支持,只有TextRangePattern)

private void btnColor_Click(object sender, EventArgs e)

    if (element == null) return;
    var ctrl = sender as Control;
    if (element.TryGetCurrentPattern(ValuePattern.Pattern, out object pattern)) 
        (pattern as ValuePattern).SetValue(ctrl.Text);
        this.Activate();
    

接收命令的应用程序使用其 TextBox 控件的 TextChanged 事件从其他应用程序接收字符串并决定做什么: (注意TextBox可以在屏幕外,但它的Visible属性必须设置为true

private void textBox1_TextChanged(object sender, EventArgs e)

    var color = Color.FromName((sender as Control).Text);
    pictureBox1.BackColor = (color.IsKnownColor) ? color: Color.White;


示例功能:


两个应用程序的完整源代码: UI 自动化需要引用这些程序集:UIAutomationClientUIAutomationTypes

UIAClientApp

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Automation;

public partial class UIAClientApp : Form

    AutomationElement element = null;
    private void comboBox1_DropDown(object sender, EventArgs e)
    
        var dict = new Dictionary<IntPtr, string>();
        foreach(var proc in Process.GetProcesses().Where(p => p.Id > 4 && 
            p.MainWindowHandle != this.Handle && 
            !string.IsNullOrEmpty(p.MainWindowTitle)).ToList())
        
            dict.Add(proc.MainWindowHandle, proc.MainWindowTitle);
        
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";
        comboBox1.DataSource = dict.ToList();
    

    private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
    
        lblCurrentApp.Text = comboBox1.SelectedItem.ToString();
        var window = AutomationElement.FromHandle((IntPtr)comboBox1.SelectedValue);
        if (window != null) 
            GetCommElement(window, ControlType.Edit);
        
    

    private void GetCommElement(AutomationElement parent, ControlType controlType)
    
        element = parent.FindFirst(TreeScope.Subtree, 
            new PropertyCondition(AutomationElement.ControlTypeProperty, controlType));
    

    private void btnColor_Click(object sender, EventArgs e)
    
        if (element is null) return;
        var ctrl = sender as Control;
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out object pattern)) 
            (pattern as ValuePattern).SetValue(ctrl.Text);
            this.Activate();
        
    

UIATestApp

using System.Drawing;
using System.Windows.Forms;

public partial class UIATestApp : Form

    public UIATestApp() => InitializeComponent();

    private void textBox1_TextChanged(object sender, EventArgs e)
    
        var color = Color.FromName((sender as Control).Text);
        pictureBox1.BackColor = (color.IsKnownColor) ? color: Color.White;
    

【讨论】:

非常感谢,这正是我想要的,而且效果很好,谢谢 好吧,我很高兴它有帮助:)

以上是关于如何将字符串从一个 winform 应用程序发送到另一个应用程序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串从一个活动发送到另一个活动

如何将短字符串从 Visual Basic 应用程序发送到 Delphi 应用程序?

含有html标签的字符串,如何在winform中显示?

如何将字符串数据从活动发送到片段?

如何在 C# Winforms 的下拉列表控件中获取数据源名称

从 Winforms 应用程序发送全局击键/伪造全局热键