Как проверить, нет ли ввода с клавиатуры или мыши в течение определенного периода времени в C # - PullRequest
3 голосов
/ 24 июля 2011

Я пытаюсь написать строку кода, которая проверяет, нет ли ввода от клавиатуры и мыши и не изменяется ли положение мыши в течение одной минуты.Если это условие истинно, вызвать событие:

if ((no_Keyboard_input) && (no_mouse_input) && (no_change_in_mousePosition))
{
    start_timer;
    if (time_elapsed == 1 min)
    {
         playAnimation;
    }
}

Ответы [ 2 ]

9 голосов
/ 24 июля 2011

Используя API, вот метод, который я использовал раньше:

[DllImport("user32.dll")]
public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetTickCount();

[StructLayout(LayoutKind.Sequential)]
public struct LASTINPUTINFO
{
    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));

    [MarshalAs(UnmanagedType.U4)]
    public int cbSize;

    [MarshalAs(UnmanagedType.U4)]
    public UInt32 dwTime;
}

Как его использовать:

public static TimeSpan GetIdleTime()
{
    TimeSpan idleTime = TimeSpan.FromMilliseconds(0);

    LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
    lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
    lastInputInfo.dwTime = 0;

    if (GetLastInputInfo(ref lastInputInfo))
    {
        idleTime = TimeSpan.FromMilliseconds(GetTickCount() - (lastInputInfo.dwTime & uint.MaxValue));
        //idleTime = TimeSpan.FromSeconds(Convert.ToInt32(lastInputInfo.dwTime / 1000));
    }

    return idleTime;
}

Редактировать: Добавить GetTickCount() APIПодпись.

0 голосов
/ 24 июля 2011

Я бы посмотрел на Reactive Extensions что-то вроде этого.Они обеспечивают хороший способ объединения множества различных событий в один и приятный синтаксис LINQ для его выполнения.

Приведенный ниже код не проверен, но идея того, как вы могли бы сделать это таким образом.

DateTime lastKeyboardInput, lastMouseInput;

var mouse = Observable.FromEvent<MouseEventArgs>(MouseDown);
var keyboard = Observable.FromEvent<KeyPressEventArgs>(KeyPress);
var seconds = Observable.Timer(TimeSpan.FromSeconds(1));
mouse.Subscribe(m => lastMouseInput = DateTime.Now());
keyboard.Subscribe(k => lastKeyboardInput = DateTime.Now());

var myEvent = from tick in seconds
          where lastKeyboardEvent < DateTime.Now() - TimeSpan.FromSeconds(60)
          where lastMouseEvent < DateTime.Now() - TimeSpawn.FromSeconds(60)
          select tick;

myEvent.Subscribe(t => playAnimation());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...