Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как заменить оконную процедуру своей?


Автор: cardinal 19.3.2007, 01:13
Вот это напарился. Надо было подменить оконную процедуру, пока вспомнил как это делаеться...
Вот, небольшой примерчик наваял, может кому полезно будет (буду знать где можно быстро найти smile )

Простой пример по подмене старой оконной процедуры новой, и наоборот.
Код
Option Explicit
Dim isChanged As Boolean

Sub ChangeWindowProc()
    If isChanged Then
        hPrevWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
    Else
        SetWindowLong Me.hWnd, GWL_WNDPROC, hPrevWndProc
    End If
End Sub

Private Sub Command1_Click()
    isChanged = Not isChanged
    ChangeWindowProc
End Sub

Внимание! Обязательно новый модуль! Т.к. AddressOf может ссылаться только на другой модуль!
Код
Option Explicit
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
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 Const GWL_WNDPROC = (-4)
Public Const GCL_WNDPROC = (-24)
Public Const WM_LBUTTONDOWN = &H201
Public hPrevWndProc&

Public Function WindowProc&(ByVal hWnd&, ByVal iMsg&, ByVal wParam&, ByVal lParam&)
    Select Case iMsg
        Case WM_LBUTTONDOWN
            Beep
            Exit Function
    End Select
    WindowProc = CallWindowProc(hPrevWndProc, hWnd, iMsg, wParam, lParam)
End Function

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)