| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > [VC#] Функция 'DefWindowProc' |
| Автор: MuForum 29.10.2007, 14:42 | ||||
| Доброе время суток! - Так как мне никто не смог помочь в моей приведущей теме, то я уже пишу новую с новой проблемой. Задача: Необходимо перехватывать системные сообщения указанному окну. На C++ это выглядело так:
Перевести данный код в полном объёме на C# у меня не выходит =( # Вот то, что у меня приблизительно выходит:
|
| Автор: VisualProgrammerNET 29.10.2007, 14:59 |
| А нужно ли вообще переводить? Напиши дллку на плюсах, а потом из программы на C# просто вызывай из неё нужный метод - и будет тебе щастье |
| Автор: MuForum 29.10.2007, 15:02 |
| #2, VisualProgrammerNET - Тут дело принципа, хоче разобраться и сделать именно на C#. P.S. -> Если можешь помочь, буду благодарен. |
| Автор: Walker 29.10.2007, 15:17 | ||||
| Доброго времени суток! В .NET концепция сообщений завуалирована концепцией событий. Аналогии сможете позднее провести самостоятельно. Вы "подписываете" контрол на системное событие (Загрузка окна, щелчок кнопки мыши, нажатие на кнопку клавиатуры). Делается это путём объявления делегата.
Как только событие происходит, вызывается функция его обработки, которой в числе аргументов передаются ещё и дополнительные полезные сведения, полученные от системы - например, какая кнопка мыши именно была нажата и где находлся в это время курсор
Список событий, на которые может быть подписан контрол, приведён в документации (msdn - для встроенных MS-контролов). Если работаете в студии, то в дизайнере в свойствах контрола есть перечень событий - находите нужное, щёлкаете два раза мышкой и пишите код функции обработки события. Т.е. то, что бы Вы написали после, например, case WM_ACTIVATE: P.S. Примеры приведены на собтыие загрузки окна. |
| Автор: MuForum 29.10.2007, 15:36 |
| #4, Walker - Проблема в том, что я работаю с чужим окном, а не своим! |
| Автор: Walker 29.10.2007, 16:00 |
| Хук, что ли, поставить? Тогда, ИМХО, боюсь, C# действительно неэффективен для таких задач. Я не знаю классов, "занимающихся этим вопросом". Попробуйте поискать в направлении "C# для диагностических задач", может есть методы цепляния к чужим процессам, но и они не могут быть реализованы в безопасном коде... Кстати, нужное вам окно тоже спроектировано в .NET? Если нет, то нельзя однозначно, ведь приходится вылезать за границы среды исполнения. Тогда пишите класс управления "хуками", засунутыми в dll. |
| Автор: stab 29.10.2007, 16:21 |
| MuForum, .NET не самая подходящая среда для таких хитростей. Лучше наверное оставить этот низкоуровневый код в исходном виде, видимо, в DLL, иначе он с чужими окнами работать никак не мог. И посылать из него уведомления управляющему .NET процессу с помощью SendMessage или другого механизма. Добавлено через 7 минут и 33 секунды .. или под чужими окнами подразумеваются чужие, но в том же процессе? |
| Автор: Stepan_Lameroff 29.10.2007, 16:51 | ||
| Набросал по-быстрому (не тестировал!) Думаю, что после доработки напильником должно работать
|
| Автор: MuForum 29.10.2007, 17:25 | ||
| #8, Stepan_Lameroff - Благодарю за помощь, сейчас буду разбираться. P.S. -> Может кому понадобиться...
|
| Автор: MuForum 29.10.2007, 18:10 | ||
| #8, Stepan_Lameroff - Сделал, но к сажалению почему-то функция вообще не вызывается по время работы =( P.S. -> Появляется только сообщение "Step1", а "Step2" и "Step3" не появляются=(
P.S. -> Странно то, что функция по сути должны обрабатываться(Но как видно из примера, то шаги 2 и 3 не выводится сис.сообщениями) =( |
| Автор: Stepan_Lameroff 29.10.2007, 20:37 | ||
Посмотрите http://sourceforge.net/project/showfiles.php?group_id=175606
Там есть ответы на все ваши вопросы. (начинайте с ...\mwinapi\ManagedWinapi\SystemWindow.cs) Исходники берите лучше в SVN - "svn co https://mwinapi.svn.sourceforge.net/svnroot/mwinapi/trunk mwinapi" http://forum.vingrad.ru/index.php?showtopic=170164&view=findpost&p=1244439 я выкладывал пример работы с этой библиотекой |