Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 закоментировать перехватчики для "проблемных" контролов, то всё будет работать, но это для меня не выход... Я смотрел что возвращает ф-ция 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: Перехват функции обработки окна. |
|
|
Я прогнал у себя и все работает нормально, колдуй осторожнее
Проверь еще раз свои новые функции обработки окна. Скорее всего, там что-то не так, ведь W9x и W2k - 100% INCOMPATIBLE!!!!!))))))
W2k!!!!!!!!! - это супер. |
|
Вернуться к началу |
|
|
SeregaLBN
Зарегистрирован: 19.10.2002 Сообщения: 5 Откуда: Kiew
|
Добавлено: Сб Янв 11 2003 13:39 Заголовок сообщения: Re: Перехват функции обработки окна. |
|
|
С хуками я неработал... А после твоих слов, что у тебя всё работает, я создал минимальный тэстовый проектик - и у меня в Win2K не пашет... Если незатруднит - посмотри его: http://kserg77.chat.ru/Test.zip (всего 4К в архиве) |
|
Вернуться к началу |
|
|
nz
Зарегистрирован: 21.12.2002 Сообщения: 71
|
Добавлено: Вс Янв 12 2003 00:03 Заголовок сообщения: Re: Перехват функции обработки окна. |
|
|
)))))))))))))) Ты не поверишь)))))) У мя нет времени много копаться, но вот что я сделал и все запахало
Я в редакторе ресурсов VC++ (правда 6.0) добавил свой элемент поля со стандартным названием (IDC_EDIT1), и запустил прогу. ВСЕ ПАШЕТ!!!!!!
Видимо у тя что-то не так, и идентификаторами, наверное грызутся с чем-нибудь (жаль, что время мало, а так, я бы поискал еще что-нибудь). Ну вообщем, пиши, если что...
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 то В исходнике твой код у меня тоже не работает, как я сказал, все дело, возможно, в идентификаторах контролов. Я добавлял IDC_EDIT с помощью редактора ресурвов, он создал свой include-файл, который я дополнительно включил в проект. После этого с моим новым IDC_EDIT стало работать нормально, тоже касается и других контролов. Но при этом, твои идентификаторы остаются заблокированными, и если их разблокировать, то работать не будет => вот поэтому я и сделал вывод, что все дело в твоих константах Ща еще раз отправлю почту, лови |
|
Вернуться к началу |
|
|
|