| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Отлов WindowProc до изминения |
| Автор: Ak47black 22.8.2007, 20:40 | ||
| Здравствуйте. Как перехватить WindowProc (главную процедуру окна) до изменения. Дело в том что я хочу обрабатывать например Alt+F4 и не допускать завершения программы и тому подобное. Делаю например вот так
Тоесть делаю процедуру которая фильтрует и не передаёт дальше Alt+F4. Проблема заключается в том что если добавить например на форму TMemo, то сообщения не будут обрабатываться и при нажатии Alt+F4 форма будет закрываться. Можно конечно прикрутить и к TMemo тоже самое что и к форме но так я не могу сделать потому что на форме куча объектов. Как перехватить реальную процедуру обработки окна? Тоесть я хочу сделать чтобы все сообщения которые приходят окну сначала я обрабатывал. |
| Автор: MetalFan 22.8.2007, 21:52 | ||
а OnClose/OnCloseQuery не катит? )) з.ы. попробуй както так:
|
| Автор: Ak47black 22.8.2007, 23:01 |
| Не оба предложенные способа не работают. Я всетаки не добиваюсь именно как недать закрыться окну по нажатию Alt+F4 , хочу сделать сам перехват до обработки. |
| Автор: Fedia 22.8.2007, 23:10 | ||||||
Вариант №1:
Вариант №2
|
| Автор: Sunvas 23.8.2007, 01:28 | ||
| Ak47black, если ты хочешь чтобы форма не закрывала ИМЕННО по alt+F4, то тебе следует обрабатывать OnKeyDown! Т.е. после того, как нажаты эти две кнопки, окну посылается сообщение закрытия. И, когда окно его получает - оно не знает откуда оно к нему пришло: либо от крестика справа вверху, либо от этих кнопок. Сейчас нарисую пример отлавливания именно alt+F4. Добавлено через 5 минут и 38 секунд
|
| Автор: sentry 23.8.2007, 08:47 | ||||
Sunvas, вот так лучше смотрится
А вот пример отлова WM_CLOSE оконной процедурой:
|
| Автор: Ak47black 23.8.2007, 09:35 | ||
| Ok. С закрытием тогда понятно как сделать, но всетаки через OnKeyDown всё не перехватываться на ранней стадии. Например если попробовать перехватить и предотвратить Num Lk вот этим кодом
То он всеровно загорается. И еше например как Ctrl+Alt+Delete перехватить. |
| Автор: Ak47black 23.8.2007, 10:00 |
Тут по какой схеме происходит передача :
|
| Автор: Sunvas 23.8.2007, 11:27 | ||
Num Luck - надо хучить клаву. А по трем веселым кнопкам - ищи по форуму, там Yanis очень хороший пример приводил. |
| Автор: Yanis 23.8.2007, 12:34 | ||
http://yanis.front.ru/files/a/cad.zip. |
| Автор: MetalFan 23.8.2007, 15:25 |
| Yanis, а ето только под админом наверное будет работать... |
| Автор: Ak47black 23.8.2007, 19:52 |
| Всетаки будет-ли работать без прав админа для меня важно. Пробовал поставить хук в самом приложении (тоесть без Dll), но невышло так как винт первый перехватывает. |
| Автор: MetalFan 23.8.2007, 20:07 |
хто перехватывает??? |
| Автор: Ak47black 23.8.2007, 20:22 | ||
Windows Тоесть Windows первый проверяет вызвать-ли TaskManager. |
| Автор: Ak47black 24.8.2007, 10:40 |
| Yanis, А вообще реально сделать-ли всё это при помощи Hook, тоесть ловить это сочетание клавиш и обнулят? Ато с инджектом то могут возникнуть некоторые проблемы. У юзера может и не быть прав админа например. Я пробовал сделать hook в самой проге и в dll но не выходит перехватить до того момента когда windows вызывает сам TaskManager например. |
| Автор: Yanis 24.8.2007, 10:53 |
| Что за мания тотального контроля юзера? ОНО надо юзеру? |
| Автор: Ak47black 24.8.2007, 10:57 |
| Я хочу просто получать все кнопки которые нажимаются и не дать им исполняться, а потом их воспроизводить например на удалённом компе |
| Автор: MetalFan 24.8.2007, 12:48 |
| Ak47black, а разве тот же RAdmin или RemouteDesktop такие сочетания дублируют на "ту сторону"??? |
| Автор: Ak47black 24.8.2007, 13:18 |
| MetalFan, нет. Он заменяет их другими сочетаниями. Наверно я так и сделаю. Извиняюсь что поднял тему. |
| Автор: MetalFan 24.8.2007, 13:36 |
да я знаю, что нет) у RAdmin'а эти сочетания через меню вроде можно послать) |
| Автор: Virtuals 26.8.2007, 17:43 | ||||
под админом онли... в примере используется дебугпривелегии и запись в память другого процесса (winlogon а) в винлогоне хук ставится:
соответственно хук с помощью RegisterHotKey не прокатит нужно пользовать SetWindowsHookEx(WH_KEYBOARD, ... из длл, тоесть не передать в систему последнее нажатие VK_DELETE //должно получится удачи |
| Автор: MetalFan 26.8.2007, 21:47 |
| Virtuals, врядли это пройдет) CAD не на уровне ОС генерируется AFAIK. а передашь или нет последний Delete, это системе побарабану... з.ы. кстати, а как интересно Process Explorer от Sysinternals перехватывает CAD и себя вместо стандартного диспетчера подсовывает?! Добавлено через 6 минут и 26 секунд p.p.s нашел, как он это делает) http://www.osix.net/modules/article/?id=781 |
| Автор: Yanis 27.8.2007, 10:28 | ||
Ниче он не перехватывает. Он действует как вирус |
| Автор: MetalFan 27.8.2007, 12:01 |
какето как вирус?! тогда все антивирусы и файрфолы и проч. тоже действуют "как вирус" )) |
| Автор: Ak47black 27.8.2007, 12:22 | ||||
Взято из http://bash.org.ru.
Ну тут тогда как выход можно драйвер написать на уровне ядра который перехватывает, тока этот путь совсем нелёгкий |
| Автор: Yanis 27.8.2007, 14:11 |
Ну дебагером процесса становится. Не этично как то |