2

アイドル時間が 5 秒を超えた場合にコンピューターをロックするコンソール アプリケーション用の次のコードがあります。

問題: 5 秒経っても何も起こらない

    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);
    }

    public static long GetTickCount()
    {
        return Environment.TickCount;
    }

    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;
    }


private static Timer timer;
    private static uint idle = 0;
    static void Main(string[] args)
    {
        timer = new Timer();
        timer.Enabled = true;
        timer.Interval = 1000;
        timer.Start();

        idle += GetIdleTime();            
        System.Threading.Thread.Sleep(6000);
        if (idle > 5000)
        {
            LockWorkStation();
        }
    }
4

1 に答える 1

4

あなたのコードには、1 つまたは 2 つの奇妙な点があります。タイマーはあまり機能せず、アイドル時間を蓄積しており、再計算せずに計算してから 6 秒後にアイドル時間をテストしています。

これを試して:

    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);
    }

    public static long GetTickCount()
    {
        return Environment.TickCount;
    }

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

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

    [DllImport("user32.dll")]
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool LockWorkStation();

    static int GetLastInputTime()
    {
        int idleTime = 0;
        LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
        lastInputInfo.dwTime = 0;

        int envTicks = Environment.TickCount;

        if (GetLastInputInfo(ref lastInputInfo))
        {
            int lastInputTick = (int)lastInputInfo.dwTime;

            idleTime = envTicks - lastInputTick;
        }

        return ((idleTime > 0) ? (idleTime / 1000) : 0);
    }


    private static uint idle = 0;
    static void Main(string[] args)
    {
        while (!Console.KeyAvailable)
        {
            System.Threading.Thread.Sleep(500);
            idle = GetIdleTime();
            Console.WriteLine(idle);
            if (idle > 5000)
            {
                LockWorkStation();
            }
        }
    }
于 2012-06-11T09:20:52.190 に答える