Я хотел бы отобразить всплывающее окно с именем «Выйти из системы» в 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;
}
}
Если я хочу правильно установить время простоя клавиатуры и мыши, что мне делать?