Обработка сообщений Windows

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Обработка сообщений Windows

Сообщение Space » 21.01.2007 (Вс) 2:40

Ставлю хук на перехват сообщений Windows. Но, как только я получаю моё сообщение и хочу его обработать, вылетаю из программы и разработчика, потому, что обращаюсь к форме в процедуре перехвата сообщения. Как же выполнять какие-то действия после перехвата сообщения?
'перехватчик сообщений Windows

Код: Выделить всё
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_WNDPROC = -4
Public lpPrevWndProc As Long
Public MyHWND As Long

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)

If uMsg <> WM_My Then GoTo 10
        Me.WindowState = 0
10
End Function

'установить хук
Public Sub HookMsgWnd()
    lpPrevWndProc = SetWindowLong(MyHWND, GWL_WNDPROC, AddressOf WindowProc)
End Sub

'снять хук
Public Sub UnHookMsgWnd()
    Dim Temp As Long
    Temp = SetWindowLong(MyHWND, GWL_WNDPROC, lpPrevWndProc)
End Sub

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 21.01.2007 (Вс) 2:45

Ну во-первых процедура окна должна быть в модуле

Код: Выделить всё
Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If uMsg = WM_My Then Form1.WindowState = 0

WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)

End Function
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Сообщение Space » 21.01.2007 (Вс) 3:27

мда, понял. Я перенёс код обработки из формы в модуль и забыл про Me! :-)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.01.2007 (Вс) 14:55

А если выставить Option Explicit, то такие ошибки удастся обнаруживать гораздо быстрее...
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.01.2007 (Вс) 16:37

tyomitch писал(а):А если выставить Option Explicit, то такие ошибки удастся обнаруживать гораздо быстрее...


Просто надо придерживаться определённых правил, скажем, следить, чтобы при вызове функций передавались параметры тех типов, которые там заявлены.

А Option Explicit для меня лично - это сильная обуза. Перед запуском всех примеров с исходниками вырубается топором.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 21.01.2007 (Вс) 16:41

Ага если в настройках VB указать
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 21.01.2007 (Вс) 22:02

tyomitch писал(а):А если выставить Option Explicit, то такие ошибки удастся обнаруживать гораздо быстрее...

Alexanbar писал(а):........ А Option Explicit для меня лично - это сильная обуза.

И в чем же обуза? :roll:
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 108

    TopList