如何将重点放在WPF桌面应用程序上?

时间:2016-02-20 13:08:58

标签: c# .net wpf

我想创建一个可供我女儿使用的Windows桌面应用程序。用例是我给她一个键盘,我启动这个应用程序,这样她就可以按任何她想要的键。应用程序可以显示某些内容(例如,压缩的大字母或图片等),并阻止我的女儿从我的计算机上删除/修改内容。

我在使用特殊键处理方面遇到了一些困难。我可以使用以下技术禁用ALT + F4,但我无法通过这种方式控制ALT + TAB和Win键。

public MainWindow()
{
    InitializeComponent();
    this.KeyDown += new KeyEventHandler(OnButtonKeyDown);
}

protected override void OnPreviewKeyDown(KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Alt && e.SystemKey == Key.F4)
    {
        e.Handled = true;
    }
    else
    {
        base.OnPreviewKeyDown(e);
    }
}

我发现an article在应用程序处于活动状态时禁用了这些功能,但我认为对于非预期的应用程序退出来说它非常脆弱。

我最终做的是一种有效的解决方法,但感觉不太专业。

public MainWindow()
{
    InitializeComponent();
    System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
    dispatcherTimer.Tick += OnTimerTick;
    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);
    dispatcherTimer.Start();
}

private void OnTimerTick(object sender, EventArgs e)
{
    this.Activate();
    this.Focus();
}

正如您所看到的,我创建了一个定时器,可以不时地调整焦点。这样,如果您按下Win键或ALT + TAB,它将带回应用程序。

如何以更专业的方式关注我的应用程序?我正在考虑一种解决方案,它可以检测应用程序何时失去焦点(出于任何原因)并将焦点设置回来。

3 个答案:

答案 0 :(得分:4)

使用Window.Deactivated事件并重新激活它以达到您想要的效果:

this.Deactivated += (s, e) => this.Activate();

您还希望将应用程序全屏显示,并在应用程序中创建隐藏的快捷键。按下该按钮后,系统会提示您输入密码,然后您可以关闭该应用程序。否则,关闭应用程序也是一件麻烦事。

答案 1 :(得分:0)

在我的XAML标记中,我添加了用于停用的事件监听器。

<Window x:Class="Desktop.MainWindow"
        Deactivated="MainWindow_OnDeactivated">
...
</Window>

在后面的代码中,我添加了重新激活的事件处理程序。

namespace Desktop
{
  public partial class MainWindow : Window
  {
    public MainWindow() { InitializeComponent(); }

    private void MainWindow_OnDeactivated(object sender, EventArgs eventArgs)
    {
      Activate();
    }
  }
}

答案 2 :(得分:0)

使用 以下窗口XAML:

<Window x:Class="WpfStackOverflowTempProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="450" Width="525"
    DataContext="{RelativeSource Mode=PreviousData}"
    xmlns:local="clr-namespace:WpfStackOverflowTempProject" 
    WindowState="Maximized"   ResizeMode="NoResize"  
    Topmost="True"        
    >
  

Topmost="True"应该从功能的角度出发。 WindowState="Maximized"&amp; ResizeMode="NoResize"限制   与其他窗口的互动。