Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Определяем неактивность пользователя


Автор: Darkmaster 10.9.2010, 12:09
Возникла проблема. Пытаюсь определить, как долго пользователь уже не пользуется системой (мышью, клавиатурой). Для этого использую следующий код:


Код

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


Еще есть таймер, срабатывающий каждые 100 миллисекунд. Он в свое очередь получает значение этой функции и выводит его в Label.  В интернете во всех статьях по этой теме приводят данный код. Вот только одна беда - хотя я в своих проверках не нажимаю никаких клавиш и не трогаю мышь, тем не менее, у меня всегда получается ситуация как будто система активна. Т.е. функция возвращает значение 0. В чем проблема? Может кто-то уже сталкивался с этим. 

Автор: CYBERDREAM 10.9.2010, 12:48
Работает на ура, не знаю в чем беда
Код

#region

using System;
using System.Runtime.InteropServices;
using System.Threading;

#endregion

namespace delCON
{
    class Program
    {
        static void Main()
        {
            new Timer(CheckIt, null, 0, 2000);

            Console.ReadLine();
        }

        private static void CheckIt(Object obj)
        {
            int time = GetLastInputTime();
            if (time > 0)
                Console.WriteLine("Не активно: " + time);
            else
                Console.WriteLine("активно=>>>>>>>>>");
        }

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

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

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

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

Автор: Darkmaster 10.9.2010, 13:17
Цитата(CYBERDREAM @ 10.9.2010,  12:48)
Работает на ура, не знаю в чем беда

Даже попробовал полностью скопипастить ваш код. Та же история. Все время выдает "активно". Ума не приложу в чем проблема. Перерыл уже массу зарубежных ресурсов - у всех все работает. Странно.

Автор: CYBERDREAM 10.9.2010, 13:21
как вариант отруби мышку и клавиатуру после запуска))
Может что то у тебя влияет на активность, не спроста ведь такая нехорошесть

Автор: Darkmaster 10.9.2010, 13:58
Цитата(CYBERDREAM @ 10.9.2010,  13:21)
как вариант отруби мышку и клавиатуру после запуска))
Может что то у тебя влияет на активность, не спроста ведь такая нехорошесть

Да пробовал. И софт отрубал почти весь. Никакого эффекта не принесло...

Автор: WolfAlone 10.9.2010, 14:51
Не могу сказать точно, но когда-то очень давно я делал нечто подобное ещё на Basic или Delphi. Я конечно могу ошибаться, но должна быть какая-то готовая API-функция, так как заставке же включается опираясь как раз на время не активности пользователя!

Автор: Darkmaster 10.9.2010, 15:00
Цитата(WolfAlone @ 10.9.2010,  14:51)
Не могу сказать точно, но когда-то очень давно я делал нечто подобное ещё на Basic или Delphi. Я конечно могу ошибаться, но должна быть какая-то готовая API-функция, так как заставке же включается опираясь как раз на время не активности пользователя!

Ну, собственно, мной приведенная функция и есть она. Везде о ней в сети пишут. Вот у CyberDream работает - у меня нет. Я еще одному человеку скидывал программку - у него работает. Теперь просто интересно узнать причину - а почему может не работать? 

Автор: WolfAlone 10.9.2010, 15:00
http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx - вот тут описана эта функция.

Добавлено через 3 минуты и 41 секунду
Darkmaster, попробуйте, настроить систему на включение заставки через 1мин., включиться ли она? Возможно, в системе что-либо слетела, некая DLL-ка заменилась/повредилась, из за чего функция ведет себя не корректно, вариантов в принципе масса... Ещё возможно по тому, что это Windows...

P.S. Я вот например сейчас сижу под Windows 7 и не могу понять, почему на достаточно мощном компьютере 4х3Ггц + 8Гб ОЗУ тормозит FireFox?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)