【问题标题】:How do I send text to an active window when I click a button on a WPF window using C#?当我使用 C# 单击 WPF 窗口上的按钮时,如何将文本发送到活动窗口?
【发布时间】:2020-05-09 19:27:39
【问题描述】:

我正在使用 WPF 和 C# 构建一个屏幕键盘,我想知道当我单击按钮时如何告诉我的程序在活动窗口中输入文本。我希望它表现得像其他屏幕键盘一样。

enter image description here

【问题讨论】:

标签: c# wpf


【解决方案1】:

一种方法是使用 Messenger,就像它在 MVVM 模式中很常见。

你可以给messenger注册一个方法:

messengerInstance.Register<objecttype>(object recipient, string identCode, Action<objecttype> method);

你可以这样发送消息:

messengerInstance.Send<objecttype>(object obj, string identCode);

例如,您有一个方法MyMethod(string str)。然后就可以注册了

messengerInstance.Register<string>(this /*you are referring to this instance*/, "MyCode", MyMethod);

现在你在另一个班级发送消息:

messengerInstance.Send<string>("A", "MyCode");

现在发生的情况是,注册到代码“MyCode”的每个方法都将“A”作为参数并被执行。

更大的例子:

public class A
{
    private Messenger messenger = Messenger.Instance; //Messenger is singleton, means it is build to only have one instance

    public A()
    {
        messenger.Register<string>(this, "MyCode", MyMethod);
    }

    private void MyMethod(string str)
    {
        Console.WriteLine(str);
    }
}

public class B
{
    private Messenger messenger = Messenger.Instance;

    public B()
    {
        messenger.Send<string>("Hello, World!", "MyCode");
    }
}

当 B 类被初始化时,构造函数发送消息“Hello, World!”使用 IdentCode “MyCode”。现在 A 类收到通知“我有消息 Hello, World! 给所有注册到 MyCode 的人”。 A 类看到 MyMethod 已注册到此代码并传递消息“Hello,World!”到方法。最后你会得到输出“Hello, World!”

当然这是简化的,有很多可能性来创建这样的信使,这只是我使用的版本,但它非常没有压力,你基本上可以将信件发送到文本框。当然,您可以发送任何您喜欢的对象。例如

//an integer
messenger.Send<int>(10, "MyCode");

//a boolean
messenger.Send<bool>(true, "MyCode");

//or even other classes
messenger.Send<MyClass>(new MyClass(), "MyCode");

这是我在工作中使用的 Messenger 类:https://pastebin.com/k6q9Y6rR

【讨论】:

  • 我说的是另一个程序
  • 哦,那我不知道答案。我什至不认为很多人会,因为 Windows 已经有一个屏幕键盘,所以没有必要再创建一个
  • 我上传了我的程序的图片。
【解决方案2】:

您的按钮是否订阅了某种点击事件?如果是这样,您可以通过将按钮字符串值连接到活动窗口中的当前值来将按钮具有的值添加到您正在谈论的活动窗口中。如果没有点击事件,你可以添加一个,然后按照我上面提到的做

如何订阅按钮点击事件:

btn.Click += btn1_Click;

private void btn1_Click(object sender, RoutedEventArgs e)
{
    // concatenate to the active window result view the button value here
}

【讨论】:

  • -1:按照我的理解,OP 希望在您单击按钮后写入另一个进程的输入,就像普通的屏幕键盘一样。
  • 他想要的不是很清楚,我认为是因为他有多个代表键盘的按钮,当按下一个按钮时,他希望将值发送到活动窗口中的某种文本框
  • “我想知道当我点击一个按钮时如何告诉我的程序在活动窗口中输入文本。”,是的,这个问题确实缺乏一些关于他追求什么以及他在做什么的解释试过了,但这绝对是他要求的。
  • 但是他说他正在构建一个屏幕键盘,所以他可能必须在某个地方经历一个按钮单击事件,该事件应该更新他的活动窗口中的文本,该按钮代表他的一个键键盘
  • 你是对的,乔纳森。我想选择一个活动窗口并单击一个按钮以在该活动窗口中输入文本。
猜你喜欢
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
相关资源
最近更新 更多