Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Перехват функции обработки окна.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
SeregaLBN



Зарегистрирован: 19.10.2002
Сообщения: 5
Откуда: Kiew

СообщениеДобавлено: Пт Янв 10 2003 13:10    Заголовок сообщения: Перехват функции обработки окна. Ответить с цитатой

Мне необходимо было выполнить следующее - в моей программе (чистый WIN32 API) для диалогового окна необходимо для всех элементов окна перехватить функции обработки.
Диалоговое окно описано в файле ресурсов программы.
Я это выполнил следующим образом:
1. Определил define для описания моей (новой) ф-ции обработки окна:

#define WNDPROC_OVER(name) \
WNDPROC defWndProc_##name; \
LRESULT CALLBACK newWndProc_##name(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { \
{ \
/*здесь я выполняю свою работу...*/ \
} \
return defWndProc_##name(hwnd, msg, wParam, lParam); \
}


2. Определил define для перехвата ф-ции обработки окна:

#define SETNEWWNDPROC(hwnd, name) defWndProc_##name = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, name), GWL_WNDPROC, (LONG)newWndProc_##name)


3. В файле для каждого контрола окна определяю новую ф-цию обработки:

WNDPROC_OVER(ID_DIALOG_CONTROL1)
WNDPROC_OVER (ID_DIALOG_CONTROL2)
WNDPROC_OVER(ID_DIALOG_CONTROL3)
WNDP ROC_OVER(ID_DIALOG_CONTROL4)
// и т.д.
Замечу, что контролами диалогового окна являются кнопки, static-control'ы, editor'ы, spin'ы, tab-control'ы.

4. В файле в обработчике сообщения WM_INITDIALOG перехватываю ф-ции обработки:

BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { // WM_INITDIALOG
SETNEWWNDPROC(hwnd, ID_DIALOG_CONTROL1);
SETNEWWNDPROC(hwnd, ID_DIALOG_CONTROL2);
SETNEWWNDPROC(hwnd, ID_DIALOG_CONTROL3);
SETNEWWNDPROC(hwnd, ID_DIALOG_CONTROL4);
// и т.д.
return TRUE;
}

В результате. В Win98 всё работает. А в Win2000 вылетает. Насколько я понял, вылетает при обращении к перехваченой ф-ции обработки.
И это относится только к контролам, являющимися editor'ами, spin'ами или tab-control'ами. А для кнопок и static-control'ов всё работает и в Win2000.
Т.е. если обработчике сообщения WM_INITDIALOG закоментировать перехватчики для "проблемных" контролов, то всё будет работать, но это для меня не выход... Sad
Я смотрел что возвращает ф-ция SetWindowLong при перехвате - она отрабатывается без ошибок...
Ну и теперь собственно вопрос - в чём проблема, и как её решить?
Help my please!

Пишу на С++ в VisualC 5.0
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Adil
Гость





СообщениеДобавлено: Пт Янв 10 2003 14:41    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

А зачем тебе это нужно - может проще будет воспользоваться хуком?
Вернуться к началу
nz



Зарегистрирован: 21.12.2002
Сообщения: 71

СообщениеДобавлено: Пт Янв 10 2003 18:12    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

Да, ктати, HOOK - это мысля!!!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nz



Зарегистрирован: 21.12.2002
Сообщения: 71

СообщениеДобавлено: Пт Янв 10 2003 18:55    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

Я прогнал у себя и все работает нормально, колдуй осторожнееSmile

Проверь еще раз свои новые функции обработки окна. Скорее всего, там что-то не так, ведь W9x и W2k - 100% INCOMPATIBLE!!!!!Smile))))))


W2k!!!!!!!!! - это супер.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
SeregaLBN



Зарегистрирован: 19.10.2002
Сообщения: 5
Откуда: Kiew

СообщениеДобавлено: Сб Янв 11 2003 13:39    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

С хуками я неработал...
А после твоих слов, что у тебя всё работает, я создал минимальный тэстовый проектик - и у меня в Win2K не пашет... Sad
Если незатруднит - посмотри его: http://kserg77.chat.ru/Test.zip
(всего 4К в архиве)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nz



Зарегистрирован: 21.12.2002
Сообщения: 71

СообщениеДобавлено: Вс Янв 12 2003 00:03    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

Smile))))))))))))))
Ты не поверишьSmile))))))
У мя нет времени много копаться, но вот что я сделал и все запахалоSmile

Я в редакторе ресурсов VC++ (правда 6.0) добавил свой элемент поля со стандартным названием (IDC_EDIT1), и запустил прогу. ВСЕ ПАШЕТ!!!!!!

Видимо у тя что-то не так, и идентификаторамиSad, наверное грызутся с чем-нибудь (жаль, что время мало, а так, я бы поискал еще что-нибудь).
Ну вообщем, пиши, если что...

P.S. Вот что мне еще пришло на ум, при компиляции твоих ресурсов у мя была ошибка
вот в этой строчке:
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
и я ее закомментировал. Больше я ничего не делал, ZIP высылаю тебе на мыло. Serg_Krivulja@UkrPost.net
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
SeregaLBN



Зарегистрирован: 19.10.2002
Сообщения: 5
Откуда: Kiew

СообщениеДобавлено: Вт Янв 14 2003 16:15    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

Хм..
У меня не пашет... 8(
Я, чесно говоря, непонял, работает у тебя мой исходник в оригинальном виде?
И такой ещё вопросик - заменив идентификатор контрола на IDC_EDIT, ты не забыл поменять его в дефайнах?
PS: На мыло пришло твой письмо, но без атача.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nz



Зарегистрирован: 21.12.2002
Сообщения: 71

СообщениеДобавлено: Вт Янв 14 2003 21:34    Заголовок сообщения: Re: Перехват функции обработки окна. Ответить с цитатой

Вот sucks тоSad
В исходнике твой код у меня тоже не работает, как я сказал, все дело, возможно, в идентификаторах контролов.
Я добавлял IDC_EDIT с помощью редактора ресурвов, он создал свой include-файл, который я дополнительно включил в проект.
После этого с моим новым IDC_EDIT стало работать нормально, тоже касается и других контролов. Но при этом, твои идентификаторы остаются заблокированными, и если их разблокировать, то работать не будет => вот поэтому я и сделал вывод, что все дело в твоих константахSad
Ща еще раз отправлю почту, ловиSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...