如何将焦点放在 WPF 桌面应用程序上
本文关键字:桌面 应用 应用程序 程序上 WPF 焦点 | 更新日期: 2023-09-27 18:35:32
我想创建一个可供我女儿使用的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);
}
}
我找到了一篇文章,它在应用程序处于活动状态时禁用了此类功能,但我认为对于意外的应用程序退出来说它非常脆弱。
我最终做的是一种可行的解决方法,但感觉不太专业。
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,它将恢复应用程序。
我怎样才能以更专业的方式专注于我的申请?我正在考虑一种解决方案,该解决方案可以检测应用程序何时失去焦点(出于任何原因)并将焦点放回原位。
使用 Window.Deactivated
事件并重新激活它以实现您想要的:
this.Deactivated += (s, e) => this.Activate();
您还希望使应用程序全屏并在应用程序中创建一个隐藏的快捷键。按下该按钮后,系统会提示您键入密码,然后您可以关闭应用程序。否则,为您关闭应用程序也会很麻烦。
在我的 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();
}
}
}
使用以下 窗口 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"
限制 与其他窗口的交互。