2016-02-20 35 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鍵。或者用戶可以最小化窗口。 –

相關問題