GetLastInputInfo
От: Аноним  
Дата: 29.11.09 13:06
Оценка:
здравствуйте господа !

Я пытаюсь применить функцию WinApi GetLastInputInfo(LASTINPUTINFO plii)
и как показано ниже вызываю ее с проверкой на true и false
if (GetLastInputInfo(linput))
Компилится все нормально .
Однако когда я пытаюсь выполнить это выдается сообщение System.AccessViolationException was unhandled
которое описано ниже .
Может быть ктото уже на эти грабли наступал ?
И как вообще тогда правильно применить GetLastInputInfo для простого обнаружения активности пользователя ?


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern bool GetLastInputInfo(LASTINPUTINFO plii);
internal struct LASTINPUTINFO
{
internal long cbSize;
internal long dwTime;
}


LASTINPUTINFO linput;

if (GetLastInputInfo(linput))


System.AccessViolationException was unhandled
Message="Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Source="Power"
StackTrace:
в Power.Form1.GetLastInputInfo(LASTINPUTINFO plii)
в Power.Form1.timer1_Tick(Object sender, EventArgs e) в C:\Developer_project\C#\Power\Power\Form1.cs:строка 62
в System.Windows.Forms.Timer.OnTick(EventArgs e)
в System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в Power.Program.Main() в C:\Developer_project\C#\Power\Power\Program.cs:строка 19
в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:


03.12.09 08:54: Перенесено модератором из '.NET' — TK
Re: GetLastInputInfo
От: Мизантроп  
Дата: 29.11.09 13:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

А> internal static extern bool GetLastInputInfo(LASTINPUTINFO plii);
А> internal struct LASTINPUTINFO
А> {
А> internal long cbSize;
А> internal long dwTime;
А> }

Эта функция принимает указатель на структуру — нужен ref. Её поля должны быть размером по 4 байта, идти последовательно, и необходимо перед вызовом проинициализировать поле cbSize размером структуры.
Вот так вроде работает:

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
        [StructLayout(LayoutKind.Sequential)]
        internal struct LASTINPUTINFO
        {
            internal uint cbSize;
            internal UInt32 dwTime;
        }

        private void button8_Click(object sender, EventArgs e)
        {
            LASTINPUTINFO lif = default(LASTINPUTINFO);
            lif.cbSize = (uint)Marshal.SizeOf(lif);
            if (GetLastInputInfo(ref lif)) MessageBox.Show(lif.dwTime.ToString());
        }
"Нормальные герои всегда идут в обход!"
Re: GetLastInputInfo
От: Львёнок Россия  
Дата: 03.12.09 02:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>здравствуйте господа !


А> Я пытаюсь применить функцию WinApi GetLastInputInfo(LASTINPUTINFO plii)

А> и как показано ниже вызываю ее с проверкой на true и false
А> if (GetLastInputInfo(linput))
А> Компилится все нормально .
А> Однако когда я пытаюсь выполнить это выдается сообщение System.AccessViolationException was unhandled
А> которое описано ниже .
А> Может быть ктото уже на эти грабли наступал ?
А> И как вообще тогда правильно применить GetLastInputInfo для простого обнаружения активности пользователя ?


А>[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

А> internal static extern bool GetLastInputInfo(LASTINPUTINFO plii);
А> internal struct LASTINPUTINFO
А> {
А> internal long cbSize;
А> internal long dwTime;
А> }


А> LASTINPUTINFO linput;


А>if (GetLastInputInfo(linput))



...
        [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 int cbSize;
            [MarshalAs(UnmanagedType.U4)]
            public UInt32 dwTime;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            LASTINPUTINFO li = new LASTINPUTINFO();
            li.cbSize = Marshal.SizeOf(li);
            GetLastInputInfo(ref li);
            SetBacklight(Convert.ToInt32(Brightness / 200.0 * 100.0));
        }
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.