Убедитесь, что приложение не работает в течение определенного периода времени и блокирует его
В моем проекте мне нужна блокировка приложения (такая же, как блокировка Windows). Если приложение не используется в течение определенного периода времени, приложение должно быть заблокировано, то есть появится окно входа в приложение. Как это сделать в приложении WPF C #?
- Замки вокруг манипуляции с памятью через встроенную сборку
- Механизм блокировки файлов SFTP
- Создание приложения Android Lock Screen.
- asynchronous и неблокирующий
- Нужно ли блокировать или маркировать как изменчивые при доступе к простому булевому флагом в C #?
- Почему блокировка (это) {...} плохая?
- Можно ли использовать строку в качестве объекта блокировки?
- Исключение SQLite: проблема блокировки базы данных
Вы можете использовать эти функции
- LockWorkStation
- GetLastInputInfo
см. этот код, вы должны добавить таймер в свою форму и установить 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(); } } }
ИМО принятый ответ не так хорош, как этот метод:
http://www.codeproject.com/Articles/30345/Application-Idle
В статье CodeProject используются сообщения Windows, которые заставят компонент учитывать, что приложение не работает , например
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, ///
Установите время ожидания при загрузке, и каждый раз, когда происходит «активное» действие (вам нужно подключиться к ним), верните таймер обратно в начало.