![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка сообщения программе от ловушки сообщений [D7, Win2k, WinXP]
Fedia © (2004-12-09 05:16:00)Доброго времени суток.
У меня на повестке дня вот какая задача.
Пишу программу Joke, задачей которой будет:
- отключение, включение панели задач;
- изменение цветовой палитры Windows;
- изменения разрешения экрана;
- открытие (закрытие) CD;
- ограничение области перемещения мышки и т.д.
- и другие мелкие радости;
Она будет резидентно сидеть в памяти и через определенные интервалы времени производить вышеперечисленные действия. Испытывать ее буду для начала на себе, а потом на коллегах, и дабы мне за нее голову не оторвали, хочу сделать ее наиболее безобидной. С этой целью хочу предусмотреть:
- запоминание всех настроек пользователя при запуске программы;
- восстановление настроек при нажатии определенных комбинаций клавиш.
У меня уже написана ловушка системных сообщений, в виде dll, которая отлавливает нажатие данной комбинации клавиш и отправляет сообщение программе Joke, единственное что не получается сделать, так это принять данное сообщение и обработать его.
Осуществляю отправку сообщения следующимобразом:
// поиск окна программы
OurWindow:=FindWindow(nil, 'svchost32');
//отправка сообщения
SendMessage(OurWindow, 27, 27, 27);
Принимать пытаюсь следующим образом:
procedure TFormMain.WndProc(var Message: TMessage);
begin
if (Message.msg=27) and (Message.LParam=27) and (Message.WParam=27) then
ShowMessage('1'); //здесь будет происходить восстановление настроек системы
//и прекращение безобразия
inherited;
end;
Основная беда в том, что программа принимает сообщение только в случае, если ее окно активно, что не есть хорошо, ведь программу не должно быть видно.
Вопрос: каким образом необходимо отправлять и принимать сообщения, чтобы программа принимала их в независимости от видимости и активности своего окна.
P.S. просто у человека сегодня выходной :)
Игорь Шевченко (2004-12-11 12:22:00) [1]Fedia © (09.12.04 05:16)
На сайте www.xakep.ru есть такой раздел "Западлостроение". Вам туда.
Piter (2004-12-11 11:56:00) [2]Leonid Troyanovsky (09.12.04 8:58) [1]
Не, лучше сразу предусмотреть каппу, такую как у боксеров
:)
P.S. Очередной троянописатель...
Leonid Troyanovsky (2004-12-11 11:51:00) [3]> Fedia © (11.12.04 08:41) [2]
> >Мдя. Радостей полные .. наборы :(
> Все будет неплохо, если действовать по принципу: не навреди.
> Если же при этом человеку удастся поднять настроение, то
> совсем неплохо.
Почему не выбрать для веселения менее раздражительные действия?
> >Не, лучше сразу предусмотреть каппу, такую как у боксеров.
> так часто бьют :)
Думаю, что люди со стажем хоть раз были свидетелями подобных
расправ. Вовсе не обязательно быть их участником.
> >Не верю. Скорее всего, ты ShowMessage не видишь.
> Это по принципу ты суслика видишь? И я не вижу, а он есть.
Есть, есть. Я вчера его здесь видел.
> >Оно и так принимает.
> Может быть и принимает, но в обработчик
> procedure TFormMain.WndProc(var Message: TMessage);
> сообщение не попадает.
Дело в том, что выбрал ты сообщение на редкость удачно,
это WM_DEVICECHANGE.
Работать оно должно после RegisterDeviceNotification.
Как сам понимаешь рассылает его сама система. Причем
A window receives this message through its WindowProc function.
Т.е., если приложение скрыто, то, видимо, при ручной
посылке оно просто-таки не отсылается.
Так, что "не верю" забираю назад. Извини.
> В этом случае, чаше всего, сообщение до принимающего обработчика доходит.
А зачем 20 раз? Ты отправляешь PostMessage?
--
С уважением, LVT.
Fedia (2004-12-11 08:41:00) [4]>Мдя. Радостей полные .. наборы :(
Все будет неплохо, если действовать по принципу: не навреди. Если же при этом человеку удастся поднять настроение, то совсем неплохо.
>Не, лучше сразу предусмотреть каппу, такую как у боксеров.
так часто бьют :)
>А какого хрена 27? Выбирай уж из WM_USER+, или
>RegisterWindowMessage.
Действительно, заменил 27 на WM_USER и стало лучше, теперь программа принимает сообщение, если бездействует, в не зависимости от положения и видимости окна.
>Не верю. Скорее всего, ты ShowMessage не видишь.
Это по принципу ты суслика видишь? И я не вижу, а он есть. Так что ли?
>Оно и так принимает.
Может быть и принимает, но в обработчик
procedure TFormMain.WndProc(var Message: TMessage);
сообщение не попадает.
Проблему то я решил, не нравится что только криво. Теперь я отправляю сообщение в цикле (около 20 раз), через 15 м.с. В этом случае, чаше всего, сообщение до принимающего обработчика доходит.
Leonid Troyanovsky (2004-12-09 08:58:00) [5]> Fedia © (09.12.04 05:16)
> Пишу программу Joke, задачей которой будет:
> - отключение, включение панели задач;
> - изменение цветовой палитры Windows;
> - изменения разрешения экрана;
> - открытие (закрытие) CD;
> - ограничение области перемещения мышки и т.д.
> - и другие мелкие радости;
Мдя. Радостей полные .. наборы :(
> Она будет резидентно сидеть в памяти и через определенные
> интервалы времени производить вышеперечисленные действия.
> Испытывать ее буду для начала на себе, а потом на коллегах,
> и дабы мне за нее голову не оторвали, хочу сделать ее наиболее
> безобидной. С этой целью хочу предусмотреть:
> - запоминание всех настроек пользователя при запуске программы;
> - восстановление настроек при нажатии определенных комбинаций
> клавиш.
Не, лучше сразу предусмотреть каппу, такую как у боксеров.
> SendMessage(OurWindow, 27, 27, 27);
А какого хрена 27? Выбирай уж из WM_USER+, или
RegisterWindowMessage.
> Основная беда в том, что программа принимает сообщение только
> в случае, если ее окно активно, что не есть хорошо, ведь
Не верю. Скорее всего, ты ShowMessage не видишь.
> Вопрос: каким образом необходимо отправлять и принимать
> сообщения, чтобы программа принимала их в независимости
> от видимости и активности своего окна.
Оно и так принимает.
См., например, по результату SendMessage.
--
С уважением, LVT.