Все сообщения от всех SubClass в одну процедуру.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Все сообщения от всех SubClass в одну процедуру.

Сообщение Avtopic » 24.05.2008 (Сб) 12:28

Здравствуйте!

Задача заключается в следующем, мне нужно, чтобы, на сколько бы окон не висел SubClass, все сообщения от всех окон приходили в одну процедуру WinProcAll. Все сделал, но имеется следующий вопрос.

имею SubClass Dll. очень давно взял в кирпичах переделал под свои нужды и уже ни могу вспомнить, кто автор. Может по названиям переменных кто-то вспомнит кто автор, за что заранее извиняюсь.

Внутри Dll два класса. clsCaller, и собственно clsSubClasser

Вызов происходит так
Код: Выделить всё
   Set Cs = New clsCaller
    Cs.AddToInterests hWnd_интересующего_окна1, Me.hWnd
    ...
    Cs.AddToInterests hWnd_интересующего_окна2, Me.hWnd
    ...
    Cs.AddToInterests hWnd_интересующего_окна3, Me.hWnd


при этом создается SubClass интересующего окна, и в экземпляре SubClasser-ера этого окна, к Private коллекции Callers добавляется (запоминается) Cs(экземпляр моего clsCaller).
При работе в moduleWinProc, прохожу по всем запомненным Callers окна и инициирую Event

Код: Выделить всё
    For i = 1 To Callers.Count

        Set REFtoCaller = Callers.Item(i)
       
        If Not REFtoCaller Is Nothing Then

                Call REFtoCaller.Raise_Event(hWnd, uMsg, wParam, lParam, lRetVal)

            Set REFtoCaller = Nothing
        End If
   
    Next

Таким образом все сообщения поступают во все clsCaller которые включены в коллекцию Callers, а оттуда в одну процедуру, с помощью одного итого же Event-а

Научите относительно следующего:
По идее, если б Event посылался в одну процедуру WinProc после
RaiseEvent(hWnd, uMsg, wParam, lParam, lRetVal)
должно происходить проверка lRetVal и в случае его неизменения вызов функции
CallWindowProc(prevProc, mhWnd, uMsg, wParam, ByVal lParam)

Вопрос такой:
куда посадить CallWindowProc(prevProc, mhWnd, uMsg, wParam, ByVal lParam)
в случае приведенном выше? Когда имеются несколько RaiseEvent(hWnd, uMsg, wParam, lParam, lRetVal)

Спасибо, если кто поможет.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.05.2008 (Сб) 22:25

Делай сабклассинг через API.
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 24.05.2008 (Сб) 23:15

:shock:
Я через API делаю Dll.
Учитывая, что ответ абсолютно не соответствует вопросу, постараюсь уточнить вопрос завтра.
Этот компьютер не имеет русские символы на клавиатуре.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 24.05.2008 (Сб) 23:35

Я через API делаю Dll.
:shock:

Ты ничего не путаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 25.05.2008 (Вс) 10:58

Хакер
Предыдущее сообщение я набирал Copy-Paste-ом, не нужно придираться к словам
это отразится на вашем имидже “телепата”

alibek
Без API как Subclass-ить я вообще не знаю.
В Dll-е после установки SetWindowLongPtr ..., GWLP_WNDPROC,...в модуле имею, конечно же, WinProc процедуру.
мне нужно чтобы при использовании Dll была возможность:
1. Subclass-ить несколько окон и все сообщения от всех получать в одну процедуру.
2. если окно Subclassed, то можно было установить, как бы, запрос на ее сообщения, одновременно в других местах программы, чтобы сообщения одного окна посылались в нескольких процедурах, ясно последовательно.

Как уже писал, все это сделал и работает, но запутался в чем: когда и как вызвать “Previous Procedure”- CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) ,
и в этом хочу ваш совет.

на примере: допустим, от одного окна сообщения ожидают два экземпляра моего класса Celler.
происходит это по следующей последовательности

а) классический Subclassing, Сообщение приходит в модуль (Dll), в процедуру WinProc (ByVal hwnd As Long,... ;
б) там из коллекции SubClassedWindows достается экземпляр “hwnd”(какое окно) класса clsSubClasser, и перенаправляется сообщение туда. Тоже, по-моему, классический случай, все такие библиотеки построены по такому сценарию;
г) у этого экземпляра clsSubClasser имеется внутренняя коллекция Cellers, какие Celler-s делали запрос на сообщения.
д) и поочередно во всех Celler генерируется Event
RaiseEvent WMProc(hwnd, uMsg, wParam, lParam, lRetVal)

т.е. в нашем примере происходит два раза генерация этого Event-а

Код: Выделить всё
  For i = 1 To Callers.Count ' их у нас два

        Set REFtoCaller = Callers.Item(i)
       
        If Not REFtoCaller Is Nothing Then

                ' сам Event генерируется внутри класса Caller, в процедуре Raise_Event
                Call REFtoCaller.Raise_Event(hWnd, uMsg, wParam, lParam, lRetVal)

            Set REFtoCaller = Nothing
        End If
   
    Next

а куда ставить CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)?
у меня стоит после этого цикла и работает так, но это не правильно, нужен совет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.05.2008 (Вс) 11:35

Предыдущее сообщение я набирал Copy-Paste-ом, не нужно придираться к словам
это отразится на вашем имидже “телепата”

Я не к словам придираюсь, а к смыслу. Его там нет. А зачем набирать сообщения Copy-Paste-ом, если при этом они будут полностью лишены смысла?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 25.05.2008 (Вс) 19:38

К сожалению, нет.

Все это чуть по-другому уменья уже сделано. И все сообщения приходят в одну процедуру. И оттуда тоже рассылаю куда надо.
мне нужно ко всему этому добавить возможность SubClassing-а одного окна с нескольких мест кода.

Представьте себе форма1. И две формы код, в которых SubClass-ит эту форму1.
Все сообщения у меня получаются в одну процедуру (потому что длл), их не различает даже hWnd, потому что и там и там форма1.hWnd.

Ну, какими то коллекциями я их различил, и разослал по своим местам, перебирая коллекцию Callers.
... но пропала возможность вызывать в коде
CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
instead, after or before моих действии или наоборот...

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 26.05.2008 (Пн) 15:46

AlexManiacRegName01 писал(а):если пропала возможность, значит каке-то логические ошибки присутствуют.
Вопрос в другом: приходит , например, WM_PAINT на Form1,
этот WM_PAINT обрабатывают 2 процедуры и последовательно ,2 раза вызывают оригинальную WindowProc ? не думаю что это ваша цель :)
в случае с WM_PAINT это не смертельно, но в случае других сообщений может повлечь серьезные последствия.
Как по мне, то Вам надо немного перепроектировать этот механизм


это как раз то чему посвящен этот топик.

и эту проблему удалось решить.
Т.е. чтобы мой цикл по Callers проходил так же как несколько независимых сабклассинга.
Помогло вместо цикла использование рекурсивного вызова WinProc из самого WinProc для всех Callers.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList