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

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

ua
Offline Offline

« : 09-09-2009 14:27 » 

Здравствуйте, господа программисты! Получил задание на курсовой проэкт, разработать утилиту для ограничения времени работы за компьютером.
1. Програма должна предоставлять следующие возможности:
  • введение промежутка времени, в течение которого выполняется активная работа пользователем, и время перерыва;
  • блокировка работы компьютера на заданное время отдыха: пользователь не должен иметь возможности работать с открытыми приложениями.
2. Обязательные элементы программы:
  • программа должна быть выполнена в виде службы (ее значок должен содержаться в области извещений);
  • программа должна давать возможность вводить время активной работы и час отдыха (в минутах);
  • таймер должен включаться при любом активном действии пользователя (нажатие клавиши клавиатуры или движение мышью);
  • если больше трех минут нет активности пользователя (нажатие клавиш клавиатуры или движений мыши), таймер должен останавливаться;
  • после завершения периода активной работы должно выводиться окно программы (с сообщением о необходимом отдыхе), из которого нельзя выйти доступными путями.
3.Программа должна иметь инсталляционный пакет, который содержит все необходимы файлы для работы программы
Думаю писать в MS Visual Studio Net.2003. Подскажите с чего следует начинать, может ссылочкой поделитесь. Буду благодарен за любую информацию, которая поможет при написании КП.
« Последнее редактирование: 09-09-2009 14:32 от v.korleone » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-09-2009 20:04 » 

Лучше 2005 или 2008 студия - там инсталляционные пакеты (как тип проекта) есть.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yurza_81
Гость
« Ответ #2 : 10-09-2009 01:56 » 

Windows HOOK в этом направление надо копать (ну либо перехват Сплайсингом или коректировка IAT)
P.S. Прикольные у вас курсовые
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #3 : 10-09-2009 06:29 » 

Dimka, спасибо, буду знать. Когда-то ставил 2008, она меня просто выводила из себя - сидишь себе в нете (студия выключена) раз тебе, сообщение о обнаружении ошибки студией, и  предложении об исправление, но чтобы ты не выбирал - связь пропадает. Так, что с 2008 очень натянутые отношения. Будем пробовать - 2005.
yurza_81, спасибо почитаю.
Цитата
P.S. Прикольные у вас курсовые
Даже очень, учитывая, что курс програмирования на С, отчитали полгода, с формами вообще не работали, ну не програмитсы мы и вот тебе, такие сюрпризы...   
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #4 : 10-09-2009 15:12 » 

v.korleone, у меня работает 2008 - проблем нету (одна только - во время отладки, бывает, наглухо зависает, лечится ребутом Отлично )

А в дотнете (частности C#) есть фишка - он запускает сетевой процесс, похожий на имя проекта. Как лечится, см тут
https://forum.shelek.ru/index.php/topic,21361.0
Записан

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

ua
Offline Offline

« Ответ #5 : 10-09-2009 15:31 » 

Алексей1153++, спасибо, по-моему, было нечто похожее, поставлю студию, попробую.

Думаю начать с функций типа: SetTimer(HWND hwnd, UINT idTimer, UINT uTimeout, TIMERPROC tmprc) (информация взята отсюда http://visual-book.net/ и не вдохновляет  Не понял). Люди, киньте, пожалуйста, что-то почитать по теме.
« Последнее редактирование: 16-09-2009 05:03 от Sel » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-09-2009 16:13 » 

v.korleone Ты уж извини, но на мой взгляд (субъективный) Тебе не суждено написать данную софтину. Слишком глубоких познаний требуется по той системе в которой будет крутиться данное приложение. Ты таким знаниями не располагаешь.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #7 : 15-09-2009 16:18 » 

Serg79,  Жаль Жаль Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #8 : 16-09-2009 02:57 » 

v.korleone, не слушай, грызи - и оно разгрызётся Ага
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 16-09-2009 06:07 » 

Как-то я не могу понять а в чем собственно проблема?
ТЗ составлено достаточно четко.
нужно действовать по пунктам ТЗ.
И... все получится.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #10 : 16-09-2009 09:01 » 

v.korleone,
когда в институте давали подобные задания (т.е. когда не было уверенности, что я вообще смогу их сделать), то обычно я разбивал их на подзадачи. И сортировал по степени "понятности". И в этом же порядке их выполнял. В таком случае, если мне не удавалось решить какую-то подзадачу в срок, то, по крайней мере, у меня было что показать и либо удавалось получить положительную оценку с этим половинчатым решением, либо давали еще время на решение.

В твоем случае я пошел бы следующим путем:

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


4. Нашел бы как делать окно "из которого нельзя выйти доступными путями". -- мне кажется это проще, чем пункт 6. и потом, если время будет поджимать, можно будет добавить в менюшку пункт "Установить таймер", и , ИМХО, будет готово решение, которое (повторюсь -- если нет времени и деваться некуда) можно показывать и надеяться на какую-то оценку...

5. Научиться делать инсталляторы. Опять же проще чем 6. , а как показывает практика -- "красивая обертка" -- гораздо больше чем "половина дела". 
На этом этапе у тебя есть почти ВСЕ задание кроме всего лишь одного пункта Ага


6. Научился узнавать о том что юзер двигает мышкой и тыкает кнопки. И "прикрутить"  эти знания к твоей проге.


Удачи  Действовать надо быстро




P.S.
Ответ, на вопросы типа "где мне почитать про...." в лучшем случае -- MSDN Улыбаюсь
Зато на вопросы, на которые нужно ответить "Да" или "Нет" ответы приходят гораздо быстрее Ага

Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #11 : 16-09-2009 10:02 » 

Артем, я как раз на том пути, который ты предлагаешь (мне он тоже показался дельным). Добрые люди, поделились исходником таймера, сижу разбираюсь с его работой. Учу новые функции, работу с окном приложения (до этого была только консоль), в общем по совету Алексей1153++ - грызу, с надеждой разгрызть.
« Последнее редактирование: 16-09-2009 10:47 от v.korleone » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 16-09-2009 10:10 » 

Что значит "поделитесь исходником таймера"?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #13 : 16-09-2009 10:14 » 

Джон, читайте внимательно текст  Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 16-09-2009 10:46 » 

Что понимаешь под ИСХОДНИКОМ ТАЙМЕРА?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #15 : 16-09-2009 10:49 » 

Понимаю, программу-таймер с исходным кодом.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #16 : 16-09-2009 10:51 » 

v.korleone, тебе надо не исходник, а завести таймер (SetTimer()) , а потом ловить сообщение WM_TIMER
Записан

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

ua
Offline Offline

« Ответ #17 : 16-09-2009 11:08 » 

Алексей1153++, у меня есть готовая, рабочая программа-таймер, думал разбираться по ней. Но учитывая ваши пожелания, нашел статью по теме, буду учится по статье: http://www.cyberguru.ru/cpp-sources/system/ispolzovanie-tajmerov.html
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #18 : 16-09-2009 11:12 » 

v.korleone, для понимания не нужна программа-таймер, нужно лишь прочитать описание  SetTimer Улыбаюсь
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 16-09-2009 11:14 » 

Строго говоря, в MSDN и демонстрационный код ("программа-таймер") есть: http://msdn.microsoft.com/en-us/library/ms644901%28VS.85%29.aspx
« Последнее редактирование: 16-09-2009 11:17 от Вад » Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #20 : 16-09-2009 11:43 » 

Вад, спасибо за ссылку. Я в ссылке приведеной мной выше, нашел этот пример, но на русском языке, что для меня немаловажно. Пробовал копипастить - увы  Улыбаюсь Будем разбираться пошагово (пожалуйста, не судите):
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
HANDLE hwnd; //дескриптор файла

// Устанавливаем два таймера.
// 1-й
SetTimer(hwnd, // хэндл главного окна
          IDT_TIMER1, // идентификатор таймера
          10000, // интервал - 10 секунд
          (TIMERPROC) NULL); // процедуры таймера нет
// 2-й
SetTimer(hwnd, // хэндл главного окна
          IDT_TIMER2, // идентификатор таймера
          300000, // пяти-минутный интервал
          (TIMERPROC) NULL); // процедуры таймера нет

case WM_TIMER:
switch (wParam)
{
case IDT_TIMER1:  // обрабатываем 10-ти секундный таймер
        return 0;
case IDT_TIMER2: // обрабатываем пятиминутный таймер
        return 0;
}
// Удаляем таймеры.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);

Скажите, пожалуйста, какого типа ставить IDT_TIMER1? Если вопрос не понятен (могу не правильно употреблять терминологию), то имею ввиду, что hwnd типа HANDLE, какого типа ставить IDT_TIMER1?


upd научись форматировать код
« Последнее редактирование: 16-09-2009 11:55 от Sla » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #21 : 16-09-2009 11:53 » 

v.korleone, а прототип KillTimer смотрел ? Ага
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 16-09-2009 11:57 » 

Целочисленного типа. Вообще, согласно документации, UINT_PTR. Что означает - беззнаковое целое (минимум - 32битное).
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 16-09-2009 12:36 » 

v.korleone, вот смотри. Итак ясно, что ты новичок. По идее написать код работающий по таймеру дело пары минут. Но это противоречит философии нашего форума. Поэтому тебе и "помогают" ссылками и советами. Ибо когда ты его наконец-таки сделаешь, а ты его сделаешь, ты сам скажешь: "блин как всё просто!".

Но несмотря на это. Почему ты начинаешь со сложностей? Почему у тебя ДВА таймера? Разберись с одним, после этого можешь хоть миллион их делать. Не надо заниматься тупым копированием кода ДАЖЕ из MSDN, в надежде, что он заработает. Это просто здорово, что он у тебя не заработал. Иначе бы ты успокоился и "пошёл дальше" толком не разобравшись.

Лучше сначала разобраться, что там происходит, зачем тот или иной параметр и написать свой! код. Если тебе непонятны параметры ф-ции SetTimer, посмотри MSDN (или где ещё). Там всегда обязательно указан тип параметров.


зы Вопрос немного не в тему VS от микрософта и чистое WinApi? Требования такие?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #24 : 16-09-2009 17:07 » 

Джон, VS - Microsoft (хотя требований небыло никаких).
Цитата
Лучше сначала разобраться, что там происходит, зачем тот или иной параметр и написать свой! код.
- согласен.
« Последнее редактирование: 17-09-2009 05:36 от v.korleone » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #25 : 16-09-2009 20:15 » 

Джон, VS - Microsoft (хотя требований небыло никаких).

Я в том плане, а почему не MFC?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #26 : 17-09-2009 05:37 » 

Джон, нам было сказано, что стиль вольный хотите MFC, хотите... Я не особо понимаю, что такое MFC и почему его, судя из твоих слов, предпочтительней использовать. Можешь объяснить?
Пробую разобраться с таймером:
Код:
int main()
{
HANDLE hwnd; //дескриптор файла
UINT_PTR IDT_TIMER1; // тип таймера
WPARAM wParam;
SetTimer(hwnd, // хэндл главного окна
IDT_TIMER1, // идентификатор таймера
10000, // интервал - 10 секунд
(TIMERPROC) NULL); // процедуры таймера нет
case WM_TIMER:
switch (wParam)
{
case IDT_TIMER1:
// обрабатываем 10-ти секундный таймер
return 0;
}
// Удаляем таймер.
KillTimer(hwnd, IDT_TIMER1);
getch();
return 0;
}
Напротив строчек "(TIMERPROC) NULL" и "KillTimer(hwnd, IDT_TIMER1)" - пишет это "error C2664: 'SetTimer' : cannot convert parameter 1 from 'HANDLE' to 'HWND'  Conversion from 'void*' to pointer to non-'void' requires an explicit cast"
По поводу "case WM_TIMER:" пишет error C2046: illegal case.
По поводу "case IDT_TIMER1:" пишет error C2051: case expression not constant
Напротив "{" после "return 0;" пишет warning C4060: switch statement contains no 'case' or 'default' labels
« Последнее редактирование: 17-09-2009 06:59 от v.korleone » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #27 : 17-09-2009 07:42 » 

Посмотри:
https://forum.shelek.ru/index.php/topic,6471.msg104003.html#msg104003

В трёх словах: с MFC проще.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #28 : 17-09-2009 12:43 » 

Ой Джон, пугают меня такие утверждения "в трех словах"...  особенно адресованные человеку, которому:

Цитата: v.korleone
 курс програмирования на С, отчитали полгода, с формами вообще не работали, ну не програмитсы мы и вот тебе, такие сюрпризы...  

Вряд ли C MFC проще тому, у кого не то что с АПИ не очень получается, но и проблемы со стандартными операторами типа switch...  
Кстати, а почему MFC, а не .NET ?  топикстартеру все равно, а .NET -- более новая (и как везде пишут "более перспективная"), а про MFC, вроде как ходили слухи, что ее перестали поддерживать (хотя тут я могу ошибаться).


v.korleone,  сколько у тебя времени на выполнение задания? Похоже программирование -- это ваша далеко не основная специальность и это задание из разряда "сдал и забыл"
Если у тебя меньше чем несколько месяцев, то,  может,  имеет смысл найди человека, который сделает это задание "за деньги" (это не я Улыбаюсь ) ?  

Если же у тебя есть пара месяцев и желание разобраться -- для начала напиши программу, которая просто показывает окно на экране.  Простое пустое окно, с тремя стандартными кнопочками в верхнем правом углу ("свернуть", "во весь экран", "Закрыть")

P.S. и действительно определись на чистом ли API ты пишешь, или применяя какие-либо библиотеки (например MFC).

P.P.S. если есть желание разбираться, то,  ИМХО (!), лучше с "чистым API", т.к. в этом случае быстрее, ИМХО (!) придет понимание "как оно живет", чем если пользоваться "обертками", которые как раз и скрывают большинство деталей и тонкостей
 
P.P.P.S. По поводу твоего последнего приведенного кода:
 первый параметр функции SetTimer должен быть типа HWND
 case нельзя писать вне switch
 IDT_TIMER1 - должен быть константой, такого же типа как и wParam

P.P.P.P.S. Проверь у препода, не перепутал ли он задание  Ага
« Последнее редактирование: 17-09-2009 12:59 от Артем » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 17-09-2009 13:57 » 

Ой Джон, пугают меня такие утверждения "в трех словах"...  особенно адресованные человеку...

Это я чтоб заинтриговать. Ага

Цитата
Вряд ли C MFC проще тому, у кого не то что с АПИ не очень получается, но и проблемы со стандартными операторами типа switch... 

Эммм я не совсем то имел ввиду. Я про то, что с объектами проще работать. API по-любому нужно для понимания происходящего, но он не объектно ориентирован. MFC конечно тоже не pure OOP, но всё-таки некоторые вещи удобней изучать. На примере тоже "таймера". Используя болванку студии (диалог), я могу сразу приступить к изучению таймера. С API мне сначала надо сделать кучу "вспомогательных" и также непонятных вещей.

Цитата
Кстати, а почему MFC, а не .NET ?  топикстартеру все равно, а .NET -- более новая (и как везде пишут "более перспективная"), а про MFC, вроде как ходили слухи, что ее перестали поддерживать (хотя тут я могу ошибаться).

Ошибаешься, в 2008 студии MFC после долгих лет "застоя" (практически никаких радикальных изменений начиная с 6ой версии студии MFC 4.2 не было, так по мелочам) можно сказать впервые получил мощный апдейт.
Вот тут можешь глянуть:  http://msdn.microsoft.com/en-us/library/bb984556.aspx
« Последнее редактирование: 17-09-2009 14:03 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #30 : 17-09-2009 14:50 » 

Артем, Джон спасибо. Насчет MFC, пока не знаю, хотелось бы с таймером разобраться  Улыбаюсь а когда до создания окон дойду - тогда посмотрим.
Цитата
IDT_TIMER1 - должен быть константой, такого же типа как и wParam
А чему должно равняться начальное значение IDT_TIMER1? Ведь запись const WPARAM IDT_TIMER1 будет некоректной.
И еще вопрос: зачем вообще в коде конструкции case и switch? Был здесь http://www.cyberguru.ru/cpp-sources/system/ispolzovanie-tajmerov.html, написано следующее:
Цитата
Чтобы обработать сообщения WM_TIMER, генерируемые этими таймерами, добавьте выражение case WM_TIMER в оконную процедуру для параметра hwnd .
Пример:
case WM_TIMER:
switch (wParam)
{
case IDT_TIMER1:
// обрабатываем 10-ти секундный таймер
return 0;
.....
}
Не пойму, конструкция case, со слов Артема неправильная, зачем ее тогда приводить в качестве примера (в статье)?
Пробовал сделать так:
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
HWND mw; //дескриптор файла
const WPARAM IDT_TIMER1=1; // тип таймера
WPARAM wParam;

SetTimer(mw, // хэндл главного окна
IDT_TIMER1, // идентификатор таймера
10000, // интервал - 10 секунд
(TIMERPROC) NULL); // процедуры таймера нет

switch (wParam)
{
case IDT_TIMER1:
// обрабатываем 10-ти секундный таймер
return 0;
}
// Удаляем таймер.
KillTimer(mw, IDT_TIMER1);
getch();
return 0;
}
Все хорошо, но при запуске проги пишет это: " The variable 'mw' is being used without being initialized." т.е.  "Переменная 'mw' используется без инициализации" и прога виснет.
« Последнее редактирование: 17-09-2009 17:27 от v.korleone » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #31 : 17-09-2009 18:12 » 

когда до создания окон дойду - тогда посмотрим.

Блин, это гораздо хуже чем я думал. Жаль

Ты понимешь, вобще-то WM_TIMER это сообщение, которое получет окно. Так что окно необходимо создать ДО разборок с таймером. Без него никуда. Всё, что ты описал ниже является следствием этого "недоразумения".

В общем я так думаю, что тебе может помочь или Петцольд или уже никто. Жаль
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #32 : 18-09-2009 03:26 » 

Джон, я же говорил работал только с консолью и когда читал это
Цитата
добавьте выражение case WM_TIMER в оконную процедуру для параметра hwnd .
думал, что имеется ввиду окно консоли, тогда у меня был вопрос: "если это так то куда собственно WM_TIMER добавлять?". Спасибо, теперь все стало на места, пожалуй буду юзать MFC, чтобы не лезть в дебри. По совету Артема, буду делать это:
Цитата
Если же у тебя есть пара месяцев и желание разобраться -- для начала напиши программу, которая просто показывает окно на экране.  Простое пустое окно, с тремя стандартными кнопочками в верхнем правом углу ("свернуть", "во весь экран", "Закрыть")
.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #33 : 18-09-2009 06:34 » 

Да, с такого окошка следует начинать. Хотя с MFC это и делается проще, но вся кухня от тебя скрывается. Когда ты хочешь с ней "разбираться" решать тебе. Одно только скажу без этого никуда. Тебе надо усвоить и освоить три вещи:

1. Программирование (не путать с языком программирования). Тут тебе в помощь книжки по логике, алгоритмам, теории программировани, численым методам и тд и тп.

2. Среду (API) той системы, под которой ты собираешься создавать приложения: виндовс (тут я тебе ещё раз порекомендую Петцольда), линух, макинтош, ДОС Ага .  Другими словами, тебе нужен справочник по ф-ями и свойствам системных библиотек. Для винды на сегодняшний день это MSDN.

3. Язык программирования и его библиотеки расширения. Сюда же можно отнести и IDE - среду разработки, например MS VisualStudio. Опять же, какой именно язык и IDE решать тебе. Под виндой сейчас выделяются два основных С++ и С#. У каждого из них есть свои плюсы и минусы. И в конечном итоге при условии соблюдения п.п. 1 и 2 ты можешь "запросто" освоить оба этих языка.

Не знаю как у тебя с 1 и 3, мы сейчас пока разбираемся с 2. Тебе необходимо знать как винда работает, каким образом взаимодействуют её компоненты и тд и тп. Это не имеет никакого отношения ни к программированию, ни к языку.
У Петцольда очень хорошо систематично это всё описано. Ну и как справочник ессно MSDN.

зы Последний пинок в сторону MFC, запусти студию и создай диалоговый проект. Внимательно разберись с опциям в мастере создания проекта. Пока только для диалога! Что будет не понятно или не найдёшь в помощи, спросишь здесь, на форуме. Потом можешь сделать тоже самое на чистом API. Это будет очень полезно в плане понимания MFC. Как плюсов, так и минусов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #34 : 18-09-2009 14:33 » 

Джон, большое спасибо, за советы! Уже качаю Петцольда... Буду разбираться.

Начал читать Петцольда, так там речь идет о С#, с которым не знаком. Неужели нужно будет переучиваться на С#?
« Последнее редактирование: 07-10-2009 15:10 от Sel » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #35 : 27-09-2009 22:49 » 

v.korleone, "Ну вы блин даёте." (с)

Можно конечно и на додиез переучиться, но лучше всё-таки взять "правильную" книгу:
http://www.charlespetzold.com/pw5/index.html

Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #36 : 28-09-2009 14:45 » 

Джон, спасибо, нашел на русском языке 2 тома. Поскольку первая книга, котороя была мной найдена, действительно толковая и доступно написана, была идея писать на С#. Еще раз благодарю, за помощь, буду читать.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #37 : 05-10-2009 15:00 » 

Приветствую вас, господа програмисты. Разбираюсь с созданием окна, читаю здесь: http://www.firststeps.ru/mfc/steps/r.php?30 Возник вопрос, относительно этого
Цитата
А вот теперь нам надо создать переменную для нашего списка. Выделяем его мышкой. Правую клавишу нажимаем и выбираем ClassWizard. А там вкладку Member Variable. Двойной щелчок на IDC_LIST. И после m_ вводим имя переменной. Подтверждаем OK и всё закрываем. Обратите внимание на Category, это очень важно.
Нажимая правую кнопку мыши никакого ClassWizard нет. Насколько я понял у автора раняя версия VS++, у меня VS++ 2003. Где мне найти указаное автором окно с настройками?
« Последнее редактирование: 05-10-2009 18:02 от v.korleone » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #38 : 06-10-2009 19:17 » 

Ctrl+ClickClick
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #39 : 07-10-2009 13:26 » 

Джон, спасибо.
Перешел сюда: http://www.firststeps.ru/mfc/steps/r.php?32, делаю это:
Цитата
// diaDlg.h : header file
//
#if !defined(AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_)
#define AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define ID_TIMER_1 100
/////////////////////////////////////////////////////////////////////////////
// CDiaDlg dialog
При компиляции пишет это: "d:\My Project\Timer\TimerDlg.h(39): fatal error C1070: mismatched #if/#endif pair in file 'd:\my project\timer\timerdlg.h'" что делать?
« Последнее редактирование: 07-10-2009 14:24 от v.korleone » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #40 : 07-10-2009 14:31 » 

замени код
Код:
// diaDlg.h : header file
//
#if !defined(AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_)
#define AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define ID_TIMER_1 100
/////////////////////////////////////////////////////////////////////////////
// CDiaDlg dialog

на следующий

Код:
// diaDlg.h : header file
#pragma once

#define ID_TIMER_1 100
Записан

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

ua
Offline Offline

« Ответ #41 : 07-10-2009 18:29 » 

Алексей1153++, спасибо - пробую.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #42 : 14-10-2009 18:02 » 

Подскажите, пожалуйста, что делать. Делаю сейчас этот пункт: http://www.firststeps.ru/mfc/steps/r.php?32
Все сделал, все компилится, линкуется даже появляется окно таймера, но при нажатии на любую из кнопок, появляется окно вида:

Видать где-то привязки событий к кнопкам нет  А черт его знает...
Вот коды:
DiaDlg.h
Код:
// DiaDlg.h : header file
//
#pragma once
#define ID_TIMER_1 100
#include "afxwin.h"


// CDiaDlg dialog
class CDiaDlg : public CDialog
{
// Construction
public:
CDiaDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
enum { IDD = IDD_DIA_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
afx_msg void OnTimer(UINT); // функция реакции на таймер
bool Test;         // установка удаление таймера
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
DECLARE_MESSAGE_MAP()
public:
CListBox m_List;
};


DiaDlg.cpp
Код:
// DiaDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Dia.h"
#include "DiaDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

bool Test;
// CDiaDlg dialog

CDiaDlg::CDiaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDiaDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Test=false; // таймер не установлен
}

void CDiaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_List);
}

BEGIN_MESSAGE_MAP(CDiaDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_TIMER() // реагировать на таймер
END_MESSAGE_MAP()


// CDiaDlg message handlers

BOOL CDiaDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
m_List.AddString("Hello"); // Заносим наши данные
m_List.AddString("App");
m_List.AddString("Wizard");
return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDiaDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

void CDiaDlg::OnTimer( UINT uTime)
{
m_List.AddString("Timer !");
}

void CDiaDlg::OnButton1()
{
  if (!Test)    // если таймер не установлен
  {
  Test=true;    // установить его (логически)
  SetTimer(ID_TIMER_1,1000,NULL);  // а теперь физически
  }
  else    // а иначе (установлен)
  {
  Test=false;    // убить логически
  KillTimer(ID_TIMER_1);    // физически
  }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDiaDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #43 : 14-10-2009 19:58 » 

Немножко неграмотно сделано. Но вроде всё правильно. Попробуй вот так:

Код:
void CDiaDlg::OnTimer( UINT uTime)
{
    if(uTime==ID_TIMER_1)
    {
    m_List.AddString("Timer !");
    }
    CDialog::OnTimer(uTime);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #44 : 14-10-2009 20:04 » 

Вот деструктор, в котором вызывается ассёршн.

Код:
CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
if (m_xDispatch.m_vtbl != 0)
((COleDispatchImpl*)&m_xDispatch)->Disconnect();
ASSERT(m_dwRef <= 1);
#endif
#ifdef _AFXDLL
m_pModuleState = NULL;
#endif
}

Ща попробую твой код.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #45 : 14-10-2009 20:13 » 

Нет, всё работает как часы таймер. Вот твой код один в один.

* Diadlg.zip (42.91 Кб - загружено 738 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
v.korleone
Помогающий

ua
Offline Offline

« Ответ #46 : 14-10-2009 20:52 » 

Джон, большое спасибо! Буду разбираться.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #47 : 11-11-2009 13:52 » 

Занимаюсь, сейчас этими пунктами:
  • таймер должен включаться при любом активном действии пользователя (нажатие клавиши клавиатуры или движение мышью);
  • если больше трех минут нет активности пользователя (нажатие клавиш клавиатуры или движений мыши), таймер должен останавливаться;
  • после завершения периода активной работы должно выводиться окно программы (с сообщением о необходимом отдыхе), из которого нельзя выйти доступными путями.
Подскажите, пожалуйста, что и как. Может ссылки толковые. Пишу на Visual C#. Спасибо.
« Последнее редактирование: 11-11-2009 13:54 от v.korleone » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #48 : 11-11-2009 17:36 » 

По первым двум я бы пошел путем наименьшего сопротивления и вешал бы глобальный хук на мышь и клаву. А по последнему даже не знаю, поменял бы "вслепую" пароль на скринсейвере, и сделал бы свой "скринсейвер" с сообщением о необходимости отдыха. С паролем правда сложнее - я не знаю как его поменять. В 98 винде можно было легко вырубить клаву и мышку.
« Последнее редактирование: 11-11-2009 17:38 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
zubr
Гость
« Ответ #49 : 12-11-2009 03:49 » 

По третьему можно все окна в системе сделать невидимыми (EnumWindow, ShowWindow (  SW_HIDE)), а оставить видимым только свое окно.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #50 : 12-11-2009 15:21 » 

PooH,  zubr, спасибо. Почитал, некоторые статьи, попробовал кодить. Собственно вот:
Файл Form1.cs
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// строка помогающая использовать унаследованный код
using System.Runtime.InteropServices;

namespace TimerWork
{
    //public partial class Form1 : Form
    public class MainForm : System.Windows.Forms.Form
    {
    //получаем и настраиваем функции из среды С и С++
     delegate bool CallbackDef(int hWnd, int IParam);
     [DllImport("user32.dll")]
     static extern int EnumWindows (CallbackDef callback, int IParam);
     //static bool PrintWindow(int hWnd, int IParam);

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  
        public MainForm()
        {
            InitializeComponent();
            bool show = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        CallbackDef callback = new CallbackDef(PrintWindow);
        Showwindow(EnumWindows(callback, 0), sw_hide);
        }
      
    }
}
Файл Form1.Designer.cs
Код:
namespace TimerWork
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }

        #endregion
    }
}
Подчеркивает слово Dispose в этой строке "protected override void Dispose(bool disposing)" и пишет:

Form1.Designer.cs(14,33): error CS0115: 'TimerWork.Form1.Dispose(bool)': no suitable method found to override

Что делать?
« Последнее редактирование: 12-11-2009 15:25 от v.korleone » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #51 : 12-11-2009 16:09 » 

а в базовом классе есть void Dispose(bool disposing) ?
Записан

Удачного всем кодинга! -=x[PooH]x=-
zubr
Гость
« Ответ #52 : 12-11-2009 16:15 » 

По ошибке компиляции помочь не могу, я с C# слабо знаком. А вот Showwindow(EnumWindows(callback, 0), sw_hide); не понял. 1-й параметр функции Showwindow - хендл окна, а EnumWindows возвращает совсем другое. Тебе надо в теле CallBack-функции делать Showwindow, где хендл - параметр hwnd CallBack-функции.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #53 : 12-11-2009 19:08 » 

PooH а где можно это посмотреть этот базовый класс?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #54 : 12-11-2009 19:12 » 

щёлкнуть правой кнопкой мыши по имени класса и перейти к определению )
Записан

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

ua
Offline Offline

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

Алексей1153++, пробую пункт "Go to definition" и курсор стает на место Dispose.  А черт его знает...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #56 : 12-11-2009 19:38 » 

странно. Я точно не помню, там вроде ещё есть пункт - названия тоже не помню. Пробуй, должно перейти где то
Записан

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

ua
Offline Offline

« Ответ #57 : 12-11-2009 19:59 » 

На одном из форумов (http://forum.codenet.ru/showthread.php?t=54440) нашел это, относительно Dispose:
Цитата
Это частичный класс. Более того, это не основное его определение - лишь код, формированный дизайнером форм. Вероятно при компиляции не включается файл с содержимым вида:
Код:
namespace ProjNamespace.GUI
{
    public partial class MianForm : Form
    {
        public MianForm() {
            InitializeComponent();
        }
    }
}
После этого ответа, человек у которого была точно такая проблема, вдруг все понял  Улыбаюсь Мне описанная выше цитата ничего не говорит, может кто-то взглянув поймет о чем идет речь и где искать выход?
P.S. Алексей1153++, может я неправильно что-то делаю и что должно быть конечным результатом, должно появится окно или еще что-то? Мои действия: становлюсь в описаном выше файле Form1.Designer.cs, на слове Dispose, в строке protected override void Dispose(bool disposing), жму правую кнопку мыши и выбираю пункты из контекстного меню, перепробовал практически все.
« Последнее редактирование: 13-11-2009 06:23 от v.korleone » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #58 : 12-11-2009 21:46 » 

Цитата
Это частичный класс. Более того, это не основное его определение - лишь код, формированный дизайнером форм
я по ссылке не ходил, но скорее всего, вопрос там был про модификатор partial - он позволяет описывать класс в нескольких блоках. Так, например, почти все там классы, созданные визардом, сделаны - описание контролов в одном файле, свой код в другом.

Цитата
может я неправильно что-то делаю ... становлюсь .... на слове Dispose
конечно неправильно: тебе же надо не эту функцию найти, а класс родителя твоего класса! Улыбаюсь

например
Цитата
public partial class MianForm :  >>>Form<<<
Form -это родитель MianForm
Записан

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

ua
Offline Offline

« Ответ #59 : 13-11-2009 06:39 » 

Мои действия: становлюсь в описанном выше файле Form1.Designer.cs, на слове base, в строке base.Dispose(disposing), жму правую кнопку мыши и выбираю пункт из контекстного меню, "Go to definition". Открывается вкладка "Object [from metadata]", но ниже в строке состояния написано, что ее содержимое нельзя изменять - только читать, с чем я убедился на практике.
P.S. Пробую другой пример, взял здесь (http://m.habrahabr.ru/post/68613/) появляется ошибка, :
error CS1061: 'Block.Form1' does not contain a definition for 'Form1_Load' and no extension method 'Form1_Load' accepting a first argument of type 'Block.Form1' could be found (are you missing a using directive or an assembly reference?)
Симптомы кажется похожи на описанные выше.
 Не понял
« Последнее редактирование: 13-11-2009 10:38 от v.korleone » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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 » 

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