Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Захучить сообщения для HWND  (Прочитано 8440 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« : 14-04-2010 06:48 » 

Утро доброе. Необходимо перехватывать сообщения Windows, имея хендл окна. Рылся в инете и МСДНе - нашел, но там окно создается, и при создании ссылаются на WndProc, где уже и обрабатываются соообщения. В моем случае я имею хендл уже созданного окна.
Подкиньте наводки
Записан
zubr
Гость
« Ответ #1 : 14-04-2010 10:15 » 

Надо делать сабклассинг, то есть подменять процедуру окна. Для этого вызывать SetWindowLong с параметром GWL_WNDPROC и адресом своей процедуры окна. Сложность всего этого в том, что данную подмену необходимо делать в контексте процесса окна. То есть необходимо создать глобальный хук, чтобы внедриться в процесс окна.
Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 16-04-2010 12:18 » 

Есть некий метод, новая оконная процедура:
Код:
LRESULT CALLBACK DrawMe(HWND, UINT, WPARAM, LPARAM);
Пытаюсь ввести ее -
Код:
SetWindowLong(hWnd,  GWL_WNDPROC,   (LONG) DrawMe);
возникает ошибка еще на этапе компиляции:
error C2440: 'type cast' : cannot convert from 'LRESULT (__stdcall MyWnd::* )(HWND,UINT,WPARAM,LPARAM)' to 'LONG'
Хотя у Петцольда описано все точно так же:
Код:
LRESULT CALLBACK ScrollProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
//...
fnOldScr[i] =(WNDPROC) SetWindowLong(hwndScrol[i], GWL_WNDPROC,(LONG) ScrollProc);
//...

Почему у меня компилятор пытается приводить типы?
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 16-04-2010 12:22 » 

yudjin, ты так же присваиваешь и указываешь (WNDPROC) SetWindowLong ?
Видимо, нет.
Компилятор пытается выполнить приведение из LRESULT в LONG. Видимо, это он не умеет, а вот из WNDPROC в LONG может.
ИМХО так.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 16-04-2010 12:39 » 

Интереса ради попробовал присвоить, выполняя приведение к типу WNDPROC. Все та же ошибка....
ЗЫ: У Петцольда в примере fnOldScr объявлен как
Код:
WNDPROC fnOldScr[3];
Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 16-04-2010 13:34 » 

Пытаюсь поставить ловушку:
Код:
SetWindowsHookEx(WH_CALLWNDPROC,DrawMe,::AfxGetInstanceHandle(),0);
возникает похожая ошибка:
error C2664: 'SetWindowsHookExW' : cannot convert parameter 2 from 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'HOOKPROC'

ЗЫ: MFC-шное окно в одном потоке с приложением, пытаюсь в том же приложении его и захучить по HWND.
Решает ли это проблему :
Цитата
Сложность всего этого в том, что данную подмену необходимо делать в контексте процесса окна.
« Последнее редактирование: 16-04-2010 13:42 от yudjin » Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 16-04-2010 13:45 » 

Т.е. я даже не перехватываю сообщения... Я просто хочу назначить обработку сообщения (WM_PAINT, например) окна, имея его описатель.......
Записан
zubr
Гость
« Ответ #7 : 16-04-2010 15:10 » 

SetWindowLong(hWnd,  GWL_WNDPROC,   (LONG) &DrawMe);
SetWindowsHookEx(WH_CALLWNDPROC, &DrawMe,::AfxGetInstanceHandle(),0);
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines