2016-02-20 5 views
6

Vorrei creare un'applicazione Windows desktop che possa essere utilizzata da mia figlia. Il caso d'uso è che le do una tastiera e avvio questa applicazione in modo che lei possa premere qualsiasi tasto che desidera. L'applicazione può visualizzare qualcosa (ad esempio le lettere stampate in caratteri grandi, o immagini, ecc.) E impedisce a mia figlia di cancellare/modificare le cose da/sul mio computer.Come mantenere l'attenzione su un'applicazione desktop WPF?

Ho alcune difficoltà con la gestione delle chiavi speciali. Posso disabilitare ALT + F4 con la seguente tecnica ma non posso controllare le chiavi ALT + TAB e Win in questo modo.

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); 
    } 
} 

ho trovato an article che disattiva tali funzionalità quando l'applicazione è attiva, ma penso che abbastanza fragile per l'uscita non prevista applicazione.

Quello che ho finalmente fatto è una soluzione che funziona ma non mi sembra troppo professionale.

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

Come potete vedere ho creato un timer che riporta di nuovo l'attenzione di tanto in tanto. In questo modo, se premi il tasto Win o ALT + TAB, l'applicazione verrà ripristinata.

Come posso mantenere l'attenzione sulla mia applicazione in modo più professionale? Sto pensando a una soluzione che rileva quando l'applicazione perde la messa a fuoco (per qualsiasi motivo) e ripristina la messa a fuoco.

+2

In cima alla mia testa, penso che ci sia anche "OnFocusLost" che potresti implementare. Non sono sicuro che funzioni con tutti i WIn-key e roba del genere. –

+0

Perché non creare semplicemente un altro utente, dove tutto ciò che ha è questo programma e tutto il resto è bloccato? Poi basta semplicemente passare Utente, e quando vuoi tornare indietro, cambia Utente (e inserisci la tua password) –

risposta

3

Utilizzare l'evento Window.Deactivated e riattivarlo per ottenere ciò che si vuole:

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

Cosa si farebbe anche piacere sarebbe quello di rendere l'applicazione a schermo intero e all'interno della app creare un tasto di scelta rapida nascosta. Dopo averlo premuto, ti viene richiesto di digitare una password e quindi puoi chiudere l'app. Altrimenti, sarà una seccatura chiudere l'app anche per te.

+0

Ciao @ fᴀʀʜᴀɴ-aɴᴀᴍ! Grazie per il tuo tempo. Dove devo inserire questo codice? L'ho inserito nel costruttore 'MainWindow' ma non aiuta a reimpostare l'attenzione. Posso facilmente cambiare applicazione in questo modo.Per i tuoi altri suggerimenti: sì, l'ho fatto. :) –

+0

Questo codice non funziona. Potrebbe funzionare quando proviamo a focalizzare una finestra nella nostra app. Ma non al di fuori della nostra applicazione. –

0

Nel mio markup XAML ho aggiunto il listener di eventi per la disattivazione.

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

Nel codice sottostante, ho aggiunto il gestore di eventi per la riattivazione.

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

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

Ciao @ konrad-viltersten! L'hai provato? Ti sto chiedendo perché ho aggiunto [la mia versione corrente (localmente)] (https://github.com/gabor-meszaros/bravo) e non funziona per me. Io uso VS 2015 Community Edition, Windows 10 e ho provato VS build di debug da Visual Studio. Se funziona per te sarebbe anche utile perché significa che il problema è nella mia configurazione. –

+0

@GaborMeszaros Ho provato, sì. Per prima cosa ho provato l'evento di messa a fuoco, ma questo non ha riportato la finestra alla vista. Ma questo ha fatto. Sono su Win 8, se è diverso. Cosa intendi esattamente quando dici che non funziona? Che succede? Colpisci il break-point nel conduttore? E poi...? –

+0

Ho caricato due video su YouTube [soluzione timer] (https://www.youtube.com/watch?v=iy0AwvciBaE) e [soluzione disattivata] (https://www.youtube.com/watch?v=af6Ayg86k6I) . Nel secondo caso, quando si preme il tasto Win, rimane lì. Nel caso della soluzione Timer, riporta l'applicazione in cima e riporta l'attenzione su di essa. –

0

Usa finestra seguente 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" dovrebbe fare il trucco funzionale punto di vista. WindowState="Maximized" & ResizeMode="NoResize" per limitare l'interazione con altre finestre.

+0

Ciao @ kylo-ren! Per me non funziona. Tendo a credere che il problema si colleghi a Windows 10. Ho intenzione di aggiornare il post originale con queste informazioni. Ho aggiunto due video alla risposta di @ konrad-viltersten. La tua soluzione mi dà esattamente lo stesso risultato che la sua soluzione dà. –

+0

@GaborMeszaros Non credo che la nostra soluzione possa produrre gli stessi risultati. Teoricamente se una finestra è attivata non significa necessariamente che sarà la finestra più in alto o sarà la finestra focalizzata. Lo stesso problema con altre soluzioni pubblicate era che non stavano usando alcun ritardo tra la disattivazione per utente e quindi l'attivazione per codice. quindi l'attivazione avverrà anche prima che i risultati del risultato del risultato alt + tab. e il risultato di alt + tab sarà in definitiva visibile sullo schermo. Ho testato il mio codice nella finestra 10 e funzionava. Non sono sicuro del motivo per cui non sta funzionando per te. –

+0

@GaborMeszaros Non credo che la soluzione DispatcherTimer sia completa. Prova a vincere + tasto m. o l'utente può minimizzare la finestra. –