2016-02-20 34 views
6

我想创建一个可供我女儿使用的Windows桌面应用程序。用例是我给她一个键盘,我启动这个应用程序,以便她可以按任何她想要的键。应用程序可以显示某些内容(例如,按下的大字母或图片等),并阻止我的女儿从我的电脑上删除/修改内容。如何将重点放在WPF桌面应用程序上?

我有一些特殊的键处理困难。我可以通过以下技术禁用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 Key或ALT + TAB,它将使应用程序恢复。

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

+2

关闭我的头顶,我认为有可能实现的“OnFocusLost”。不知道它是否适用于所有WIn-key和东西。 –

+0

为什么不只是创建另一个用户,它拥有的只是这个程序,而其他所有内容都被锁定了?然后你只需切换用户,当你想回来时,切换用户(并输入你的密码) –

回答

3

使用Window.Deactivated事件,并重新激活它来实现你想要什么:

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

什么,你还想将是使应用程序全屏和应用程序中创建一个隐藏的快捷键。按下后,系统会提示您输入密码,然后关闭该应用程序。否则,为您关闭应用程序也是一件麻烦事。

+0

Hi @fᴀʀʜᴀɴ-aɴᴀᴍ!谢谢你的时间。我应该在哪里放置这些代码?我把它放到'MainWindow'构造函数中,但它不能帮助重新设置焦点。我可以轻松地切换应用程序。对于你的其他建议:是的,我做到了。 :) –

+0

此代码不起作用。当我们试图将一个窗口聚焦到我们的应用程序时,它可能会工作但不在我们的申请之外。 –

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(); 
    } 
    } 
} 
+0

Hi @ konrad-viltersten!你试过了吗?我问,因为我添加到[我当前的版本(本地)](https://github.com/gabor-meszaros/bravo),它不适合我。我使用VS 2015社区版,Windows 10,并且我尝试了Visual Studio中的VS调试版本。如果它对您有用,那也会有帮助,因为这意味着问题出在我的设置中。 –

+0

@GaborMeszaros我试过了,是的。首先,我尝试了焦点活动,但没有把窗口拉回到视图。但是这个做了。我在Win 8上,如果它有什么不同。当你说它不起作用时,你的意思是什么?怎么了?你在处理程序中遇到了什么突破点?接着...? –

+0

我上传了两个视频到YouTube [定时器解决方案](https://www.youtube.com/watch?v=iy0AwvciBaE)和[停用的解决方案](https://www.youtube.com/watch?v=af6Ayg86k6I) 。在第二种情况下,当你按下Win键时,它保持在那里。在定时器解决方案的情况下,它将应用程序带回顶部并将焦点重新提供给它。 –

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" & ResizeMode="NoResize"限制 与其他窗口的交互。

+0

Hi @ kylo-ren!它不适合我。我倾向于认为该问题与Windows 10连接。我将使用此信息更新原始帖子。我给@ konrad-viltersten的回答添加了两个视频。你的解决方案给我的解决方案给出了完全相同的结果。 –

+0

@GaborMeszaros我不认为我们的解决方案可以产生相同的结果。理论上,如果一个窗口被激活并不一定意味着它将成为最顶层窗口,或者它将成为聚焦窗口。发布其他解决方案时遇到的问题是,它们在用户停用和代码激活之间没有使用任何时间延迟。因此即使在alt + tab结果结果呈现之前激活也会发生。并且alt + tab结果最终将在屏幕上可见。我已经在窗口10中测试了我的代码,它正在工作。不知道为什么它不适合你。 –

+0

@GaborMeszaros我不认为DispatcherTimer解决方案是完整的。试试win + m键。或者用户可以最小化窗口。 –

相关问题