Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизОтправка сообщения программе от ловушки сообщений Найти похожие ветки
← →
Fedia © (2004-12-09 05:16) [0]Доброго времени суток.
У меня на повестке дня вот какая задача.
Пишу программу 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. просто у человека сегодня выходной :)
← →
Leonid Troyanovsky (2004-12-09 08:58) [1]> Fedia © (09.12.04 05:16)
> Пишу программу Joke, задачей которой будет:
> - отключение, включение панели задач;
> - изменение цветовой палитры Windows;
> - изменения разрешения экрана;
> - открытие (закрытие) CD;
> - ограничение области перемещения мышки и т.д.
> - и другие мелкие радости;
Мдя. Радостей полные .. наборы :(
> Она будет резидентно сидеть в памяти и через определенные
> интервалы времени производить вышеперечисленные действия.
> Испытывать ее буду для начала на себе, а потом на коллегах,
> и дабы мне за нее голову не оторвали, хочу сделать ее наиболее
> безобидной. С этой целью хочу предусмотреть:
> - запоминание всех настроек пользователя при запуске программы;
> - восстановление настроек при нажатии определенных комбинаций
> клавиш.
Не, лучше сразу предусмотреть каппу, такую как у боксеров.
> SendMessage(OurWindow, 27, 27, 27);
А какого хрена 27? Выбирай уж из WM_USER+, или
RegisterWindowMessage.
> Основная беда в том, что программа принимает сообщение только
> в случае, если ее окно активно, что не есть хорошо, ведь
Не верю. Скорее всего, ты ShowMessage не видишь.
> Вопрос: каким образом необходимо отправлять и принимать
> сообщения, чтобы программа принимала их в независимости
> от видимости и активности своего окна.
Оно и так принимает.
См., например, по результату SendMessage.
--
С уважением, LVT.
← →
Fedia © (2004-12-11 08:41) [2]>Мдя. Радостей полные .. наборы :(
Все будет неплохо, если действовать по принципу: не навреди. Если же при этом человеку удастся поднять настроение, то совсем неплохо.
>Не, лучше сразу предусмотреть каппу, такую как у боксеров.
так часто бьют :)
>А какого хрена 27? Выбирай уж из WM_USER+, или
>RegisterWindowMessage.
Действительно, заменил 27 на WM_USER и стало лучше, теперь программа принимает сообщение, если бездействует, в не зависимости от положения и видимости окна.
>Не верю. Скорее всего, ты ShowMessage не видишь.
Это по принципу ты суслика видишь? И я не вижу, а он есть. Так что ли?
>Оно и так принимает.
Может быть и принимает, но в обработчик
procedure TFormMain.WndProc(var Message: TMessage);
сообщение не попадает.
Проблему то я решил, не нравится что только криво. Теперь я отправляю сообщение в цикле (около 20 раз), через 15 м.с. В этом случае, чаше всего, сообщение до принимающего обработчика доходит.
← →
Leonid Troyanovsky © (2004-12-11 11:51) [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.
← →
Piter © (2004-12-11 11:56) [4]Leonid Troyanovsky (09.12.04 8:58) [1]
Не, лучше сразу предусмотреть каппу, такую как у боксеров
:)
P.S. Очередной троянописатель...
← →
Игорь Шевченко © (2004-12-11 12:22) [5]Fedia © (09.12.04 05:16)
На сайте www.xakep.ru есть такой раздел "Западлостроение". Вам туда.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c