Проверьте, не используется ли приложение какое-то время, и заблокируйте его. - PullRequest
7 голосов
/ 09 октября 2009

В моем проекте мне нужна блокировка приложения (такая же, как блокировка windows). Если приложение не используется в течение определенного периода времени, оно должно быть заблокировано, то есть откроется окно входа в приложение. Как я могу сделать это в приложении WPF C #?

Ответы [ 3 ]

13 голосов
/ 09 октября 2009

Вы можете использовать эти функции

посмотрите этот код, вы должны добавить в форму таймер и установить 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();
    }
  }
}
1 голос
/ 07 мая 2013

IMO принятый ответ не так хорош, как этот метод:

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

В статье CodeProject используются сообщения Windows, из-за которых компонент считает приложение не бездействующим , например

public enum ActivityMessages : int
{
    /// <summary>
    /// Cursor moved while within the nonclient area.
    /// </summary>
    WM_NCMOUSEMOVE = 0x00A0,
    /// <summary>
    /// Mouse left button pressed while the cursor was within the nonclient area.
    /// </summary>
    WM_NCLBUTTONDOWN = 0x00A1,
    /// <summary>
    /// Mouse left button released while the cursor was within the nonclient area.
    /// </summary>
    WM_NCLBUTTONUP = 0x00A2,
    /// <summary>
0 голосов
/ 09 октября 2009

Установите тайм-аут при загрузке, и каждый раз, когда происходит «активное» действие (вам нужно подключиться к ним), сбрасывайте таймер обратно на старт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...