Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: Утилита для ограничения времени работы за компьютером  (Прочитано 63363 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #60 : 13-11-2009 06:45 » 

эхъъ... опять ты не то ищешь. Мне кажется, дело тут вот в чём
Код:
//Form1.cs
namespace TimerWork
{
    //public partial class Form1 : Form
    public class MainForm : System.Windows.Forms.Form
    {

...
...
...


//Form1.Designer.cs
namespace TimerWork
{
    partial class Form1
    {


а надо что то вроде
Код:
//Form1.cs
namespace TimerWork
{
    public partial class Form1 : Form
    {

...
...
...


//Form1.Designer.cs
namespace TimerWork
{
    /*public*/ partial class Form1 : Form
    {

Записан

v.korleone
Помогающий

ua
Offline Offline

« Ответ #61 : 26-11-2009 08:09 » 

Пытаюсь блокировать клавиатуру глобальным хуком. Возник ряд вопросов. После того как таймер отдыха отсчитал, положенное ему время:
1: Клава не включается.
2. Как с помощью того же хука заблокировать мышь? Я знаю, что нужно изменить константу WH_KEYBOARD_LL на WH_MOUSE_LL в SetWindowsHookEx, и дописать соотв. константу WH_MOUSE_LL = 14; но как их совместить в одном хуке я не знаю  А черт его знает...
Как вернуть работоспособность (вопрос по клаве)? Вот мой код:
Код:
.... 
          /// запуск отсчета времени отдыха
      /// </summary>
      public void timerRest_Tick(object sender, System.EventArgs e)
      {
            //присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
            //его после окончания первого же вызова функции
            _proc = new LowLevelKeyboardProc(HookCallback);
            KillCtrlAltDelete();//Блокируем диспетчер задач
            SetHook(_proc);// устанавливаем хук
            countSec++;
            
        // счетчик отдыха достиг порогового времени
        if(countSec >= timeRest)
            {
                // оповещение пользователя
                this.notifyIcon.Text = "Таймер не запущен!";

                // отдохнули - можно притупать к работе
                                LiveCtrlAltDelete();//Возобновляем работу диспетчера задач
                                UnhookWindowsHookEx(_hookID);// снимаем хук
                                countSec = 0;
                timerRest.Stop();
                strPrompt = "Работа!";
                pictureBox1.Invalidate();
                panel1.Visible = false;

                
                // меняем активность элементов
                menuItemStart.Enabled = true;
                menuItemStop.Enabled = false;
                //

                PrepareWork();

                
                // оповещение, что пора начать работать
                PlaySound(strPathSound, Handle, (uint)0x00020000L|0x0001);
                
                // разрешим изменять временные интервалы перед запуском программы
                menuItemSetTimes.Enabled = true;
            }
P.S. Глобальный хук клавы писал, исходя из этой статьи http://www.sql.ru/forum/actualthread.aspx?tid=632552 вот код:
Код:
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace hook
{
    class Program
    {
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;

        static void Main()
        {
            _hookID = SetHook(_proc);
            Application.Run();
            UnhookWindowsHookEx(_hookID);

        }

        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                int vkCode = Marshal.ReadInt32(lParam);
                if (((Keys)vkCode == Keys.LWin) || ((Keys)vkCode == Keys.RWin))
                {
                    Console.WriteLine("{0} blocked!", (Keys)vkCode);
                    return (IntPtr)1;
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);

    
    
    }
}
Как сделать исходя из выше приведеного кода хук для мыши и клавы?
« Последнее редактирование: 26-11-2009 16:28 от v.korleone » Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #62 : 29-11-2009 19:20 » 

Остались последние штрихи программы. Нужно сделать следующие:
1. Программа-таймер должна включаться (т.е. производить отсчет времени работы пользователя) при любой активности пользователя (нажатие клавиши клавиатуры или движение/нажатие клавиши мыши);
2. Если более 3 минут нет активности пользователя (нажатие клавиши клавиатуры или движение/нажатие клавиши мыши), таймер должен останавливаться;
Прошу помощи с алгоритмом (это пока    ) данной программы.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #63 : 29-11-2009 19:55 » 

Глобальный хук на клавиатуру и глобальный хук на мыш. Глобальные хуки делаются в отдельной Dll. Если сам таймер используется в Dll, то нужно использовать мультимедийные таймера. Насколько я помню, простые таймера требуют дескриптор отрытого окна. Которого у тебя скорее всего и не будет.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
v.korleone
Помогающий

ua
Offline Offline

« Ответ #64 : 29-11-2009 20:55 » new

Finch, хуки уже есть только без dll т.к WH_MOUSE_LL, WH_KEYBOARD_LL этого не требуют. Мне не понятен сам алгоритм работы моего будующего приложения, что за чем должно идти. Например, вот алгоритм:
1. Запуск приложения.
2. Запуск основного таймера (ОТ).
3. Установка хуков мыши+клавы (м+к).
4. После каждой активности м+к включать вспомогательный таймер (ВТ).
5. Если пользователь нажимает на клавишу клав-ры (аналогично для мыши) и время ВТ меньше 3 минут, прежнее время сбрасывается и начинается все по новому.
6. Если после последней нажатой клавиши, прошло 3 минуты приостановить ОТ, сбросить ВТ в 0.
7. Если ОТ приостановлен и нажата любая клавиша вновь запустить ОТ.
8. Все пункты начиная с 4 по 7 повторить.
Теперь вопрос, правильный ли ход мыслей? Если, что ни так поправьте. в общем пишите любые замечания.
Записан
Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines