Member 13564932 Ответов: 1

C# как получить последнее время ввода данных пользователем


Я пытаюсь сделать заставку, которая будет включаться, когда пользователь ничего не делает в течение 5 минут.

Но я должен определить последний ввод пользователя и получить время этого ввода. Я долго искал, но нашел только одну вещь.
GetLastInputInfo
функция для С++
Я надеюсь, что кто - то сможет помочь мне с моей проблемой.

Что я уже пробовал:

/// <summary>
/// Helps to find the idle time, (in milliseconds) spent since the last user input
/// </summary>
public class IdleTimeFinder
{
    [DllImport("User32.dll")]
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);        

    [DllImport("Kernel32.dll")]
    private static extern uint GetLastError();

    public static uint GetIdleTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);

        return ((uint)Environment.TickCount - lastInPut.dwTime);
    }
/// <summary>
/// Get the Last input time in milliseconds
/// </summary>
/// <returns></returns>
    public static long GetLastInputTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        if (!GetLastInputInfo(ref lastInPut))
        {
            throw new Exception(GetLastError().ToString());
        }       
        return lastInPut.dwTime;
    }
}

0x01AA

И в чем же проблема? Вы все уже показываете, что вы пытаетесь это сделать с pinvoke. Теперь вам нужно объяснить, где вы столкнулись с проблемой ;)

F-ES Sitecore

Если это то, как работают заставки экрана, что произойдет, если я буду запускать 10 приложений, которые все пытались это сделать? Неужели после 5 минут бездействия все они будут работать одновременно? Как это будет работать?

Windows имеет встроенный фреймворк экранной заставки, вы просто пишете свое приложение, называете его соответствующим образом, пользователь устанавливает его, и Windows делает все остальное за вас.

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Ладно, с этим много проблем.

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

Во-вторых, если вы все еще настроены на запуск экранной заставки после того, как определили, что определенное количество времени прошло без ввода, вам не нужно время последнего ввода. Вам просто нужно иметь таймер, который сбрасывается при каждом входном событии. Если таймер "отсчитывает до 0" с того времени, как вы его установили, это событие "ТИК" должно выключить таймер и запустить экранную заставку.

Наконец, мне очень неприятно это говорить, но весь ваш код бесполезен. Вам ничего из этого не нужно, потому что вам не нужно опрашивать последнее входное событие (опрос интенсивен для процессора!), и вам не нужно знать, в какое время это произошло.

Обнаружение ввода с помощью мыши и клавиатуры с помощью .NET[^]
Напишите заставку, которая действительно работает[^]