在UserControl中使用SendKeys

时间:2014-08-22 11:15:04

标签: c# .net wpf xaml user-controls

我想使用C#System.Windows.Forms.SendKeys.SendWait()方法将OntrcreenKeyboard上的击键发送到文本框。由于我也可以在其他地方使用这个OnScreenKeyboard,我在一个额外的项目中创建了一个带有View(用于键盘设计)和Viewmodel(基本上用于调用Sendkeys.SendWait()方法)的UserControl。

在这个项目中,我创建了一个MainView,我通过ContentControl包含了UserControl,如下面的代码所示。 CurrentPage基本上是指键盘的Viewmodel。

    <Window.Resources>
        <DataTemplate DataType="{x:Type viewModel:KeyboardViewmodel}">
            <view:KeyboardView/>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <Border Background="White">
            <HeaderedContentControl Content="{Binding Path=CurrentPage}"/>
        </Border>

        <TextBox Width="120"/>
    </Grid>

我现在在我的窗口中有OnScreenKeyboard和一个文本框。单击文本框并按我的OnScreenKeyboard按钮将导致文本出现在我的文本框中。 KeyboardView中的所有控件都设置为避免聚焦。这对于保持对文本框的关注是必要的。

KeyboardView中的按钮全部绑定到我的KeyboardViewmodel中的Command ClickCommand。这是KeyboardViewmodel的代码:

public class KeyboardViewmodel : BaseModel
{
    public BaseCommand ClickCommand { get; set; }

    public KeyboardViewmodel()
    {
        ClickCommand = new BaseCommand(PressAndRelease);
    }

    public void PressAndRelease(object key)
    {
        if (((string)key).Length <= 1)
            SendKeys.SendWait((string)key);
        else
            SendKeys.SendWait("{" + (string)key + "}");
    }
}

现在我用这些文件创建了一个NuGet包,并将它们导入到我想要使用OnScreenKeyboard的项目中。

我做的基本上与之前测试OnScreenKeyboard时的做法基本相同。 但是让我更多地解释项目的结构: 我有MainView + MainViewmodelMainViewmodel管理可用页面之间的导航。为了显示这些页面 - 我在之前的简短示例中 - 一个ContentControl,其内容绑定到CurrentPage属性。 MainView为正常Window,其他所有观看均为UserControls

在其中一个页面中,我需要一个OnScreenKeyboard(DetailsView + DetailsViewmodel)。因此,在DetailsView中使用另一个ContentControl似乎合乎逻辑:

<Border Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="3" Height="Auto" Width="Auto">
    <ContentControl Content="{Binding Path=OnScreenKeyboard}"/>
</Border>

我在KeyboardViewmodel的构造函数中创建了DetailsViewmodelDetailsViewmodel的构造函数在启动时在MainViewmodel中调用。

所以到目前为止一切正常,OnScreenKeyboard显示在正确位置的正确页面上。如果单击OnScreenKeyboard的按钮,则会调用正确的绑定命令并调用SendKeys.SendWait()方法。

但TextBox中没有文字出现。我对SendKeys.SendAwait()方法的理解非常糟糕。此外,MSDN文档似乎在这个主题上并不是非常详尽。

它声明:“将给定的密钥发送到活动的应用程序,然后等待处理的消息。”

现在。主动/聚焦应用程序是我的应用程序。所以我的猜测是我的文本框应该处理KeyStrokes。

我的问题:

  1. 任何猜测如何进一步调试'SenWait()'方法,例如跟踪笔画真正发送到的地方或类似的内容?
  2. 这是将KeyStrokes发送到活动应用程序的正确方法吗?似乎SendKeys来自Windows Forms,我使用WPF。
  3. 我应该将我的文本框作为对OnScreenKeyboard的引用传递并直接写入引用的文本框吗?这会使我在可重用性方面不那么灵活。

  4. 更新 正如评论中指出的那样,这可能是一个重复的问题。 我很清楚各种不同的解决方案,并且已经考虑过了:

    1. http://wpfkb.codeplex.com/
    2. http://www.codeproject.com/Articles/32568/A-Touch-Screen-Keyboard-Control-in-WPF
    3. http://www.codeproject.com/Articles/145579/A-Software-Virtual-Keyboard-for-Your-WPF-Apps
    4. 但是,正如人们可能理解的那样,这些项目对我的简单需求来说太过强大了。

      这是一个截图,可以更好地了解我的需求:OnScreenKeyboard

      真的很简单。 4行按钮永远不会改变,除了将按下按钮的CommandParameter发送到文本框/活动表格之外没有其他控件/功能。

      对这个具体问题的研究没有表现出任何类似的问题。在大多数其他SO问题中,问题是将数据发送到另一个窗口,而不是在当前窗口中发送数据。 所以我不认为这个问题是重复的。

0 个答案:

没有答案