Controlla se un’applicazione è intriggers per un periodo di tempo e bloccala

Nel mio progetto ho bisogno di un blocco dell’applicazione (come il blocco di Windows). Se l’applicazione è intriggers per un periodo di tempo, l’applicazione deve essere bloccata, ovvero verrà visualizzata la finestra di accesso per l’applicazione. Come posso farlo in un’applicazione WPF C #?

Puoi usare queste funzioni

  • LockWorkStation
  • GetLastInputInfo

vedere questo codice, è necessario aggiungere un timer al modulo e impostare this.timer1.Enabled = true;

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApplication9 { internal struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } public partial class Form1 : Form { [DllImport("User32.dll")] public static extern bool LockWorkStation(); [DllImport("User32.dll")] private static extern bool GetLastInputInfo(ref LASTINPUTINFO Dummy); [DllImport("Kernel32.dll")] private static extern uint GetLastError(); public static uint GetIdleTime() { LASTINPUTINFO LastUserAction = new LASTINPUTINFO(); LastUserAction.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(LastUserAction); GetLastInputInfo(ref LastUserAction); return ((uint)Environment.TickCount - LastUserAction.dwTime); } public static long GetTickCount() { return Environment.TickCount; } public static long GetLastInputTime() { LASTINPUTINFO LastUserAction = new LASTINPUTINFO(); LastUserAction.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(LastUserAction); if (!GetLastInputInfo(ref LastUserAction)) { throw new Exception(GetLastError().ToString()); } return LastUserAction.dwTime; } public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { if (GetIdleTime() > 10000) //10 secs, Time to wait before locking LockWorkStation(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } } } 

IMO la risposta accettata non è buona come questo metodo:

http://www.codeproject.com/Articles/30345/Application-Idle

L’articolo CodeProject utilizza i messaggi di Windows che inducono il componente a considerare l’applicazione non idle , ad es

 public enum ActivityMessages : int { ///  /// Cursor moved while within the nonclient area. ///  WM_NCMOUSEMOVE = 0x00A0, ///  /// Mouse left button pressed while the cursor was within the nonclient area. ///  WM_NCLBUTTONDOWN = 0x00A1, ///  /// Mouse left button released while the cursor was within the nonclient area. ///  WM_NCLBUTTONUP = 0x00A2, ///  

Imposta un timeout sul carico e ogni volta che si verifica un’azione “triggers” (dovrai collegarti a loro), riporta il timer indietro all’inizio.