Я хочу получить простой мыши, события клавиатуры - PullRequest
0 голосов
/ 31 мая 2019

Я хотел бы отобразить всплывающее окно с именем «Выйти из системы» в c #, если мышь и клавиатура не вызывали событие в течение определенного времени, когда я ничего не делал.

Я обнаружил, что должен использовать перехват. поэтому я попробовал это. Однако я могу получить значение времени простоя мыши, но не могу получить значение времени простоя клавиатуры. Время простоя клавиатуры всегда равно 0.

Вот коды, которые я написал.

public partial class Form1 : Form
{

    private Timer timer;
    private InputSource lastInput;
    private KeyboardInput keyboard;
    private MouseInput mouse;

    public Form1()
    {
        InitializeComponent();


        keyboard = new KeyboardInput();
        keyboard.KeyBoardKeyPressed += keyboard_KeyBoardKeyPressed;

        mouse = new MouseInput();
        mouse.MouseMoved += mouse_MouseMoved;

        lastInput = new InputSource();

        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += Timer1_Tick;
        timer.Start();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        if (GetIdleTime() > 10000)
        {
            timer1.Enabled = false;
            MessageBox.Show("test");
            timer1.Enabled = true;
        }
    }
    private string FormatDateTime(DateTime dateTime)
    {
        return dateTime.ToString("HH:mm:ss");
    }

    private void keyboard_KeyBoardKeyPressed(object sender, EventArgs e)
    {
        Console.WriteLine(GetIdleTime());
        if (GetIdleTime() > 10000)
        {
            timer1.Enabled = false;
            MessageBox.Show("test");
            timer1.Enabled = true;
        }

        label_keyboard.Text = FormatDateTime(lastInput.GetLastInputTime());
    }

    private void mouse_MouseMoved(object sender, EventArgs e)
    {
        Console.WriteLine(GetIdleTime());
        if (GetIdleTime() > 10000)
        {
            timer1.Enabled = false;
            MessageBox.Show("mouse test");
            timer1.Enabled = true;
        }
        label_mouse.Text = FormatDateTime(lastInput.GetLastInputTime());
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
        //label_lastinput.Text = FormatDateTime(lastInput.GetLastInputTime());
        label_present.Text = FormatDateTime(DateTime.Now);
    }


}

и

class InputSource
{
    [DllImport("User32.dll")]
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    [DllImport("Kernel32.dll")]
    private static extern uint GetLastError();

    public DateTime GetLastInputTime()
    {
        var lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.dwTime = 0;
        lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);

        GetLastInputInfo(ref lastInputInfo);

        //if (Environment.TickCount - lastInputInfo.dwTime > 10000)
        //{
        //    MessageBox.Show("test");
        //}
        return DateTime.Now.AddMilliseconds(-(Environment.TickCount - lastInputInfo.dwTime));
    }

    public static uint GetIdleTime()
    {
        var lastinput = new LASTINPUTINFO();
        lastinput.cbSize = (uint)Marshal.SizeOf(lastinput);

        GetLastInputInfo(ref lastinput);
        return ((uint)Environment.TickCount - lastinput.dwTime);
    }
    public static long GetTickCount()
    {
        return Environment.TickCount;
    }

    public static long GetLastInput()
    {
        var lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut);
        if (!GetLastInputInfo(ref lastInPut))
        {
            throw new Exception(GetLastError().ToString());
        }
        return lastInPut.dwTime;
    }
    [StructLayout(LayoutKind.Sequential)]
    internal struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }
}

Если я хочу правильно установить время простоя клавиатуры и мыши, что мне делать?

...