Не получается переопределить оконную процедуру Экселя.
Public Const GWL_WNDPROC = -4
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Sub SetNewWindProc()
Dim hWnd As Long
hWnd = Application.hWnd
OldWindowProc = GetWindowLong(hWnd, GWL_WNDPROC)
OldWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Пока ничего не делаем
WindowProc = CallWindowProc(NewWindowProc, hWnd, Msg, wParam, lParam)
End Function
OldWindowProc в обоих случаях возвращает отрицательное значение и, как следствие, после вызова SetWindowLong Excel погибает. Для задания/получения других свойств окна, не GWL_WNDPROC, всё работает нормально.
Public Const GWL_WNDPROC = -4
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Sub SetNewWindProc()
Dim hWnd As Long
hWnd = Application.hWnd
OldWindowProc = GetWindowLong(hWnd, GWL_WNDPROC)
OldWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Пока ничего не делаем
WindowProc = CallWindowProc(NewWindowProc, hWnd, Msg, wParam, lParam)
End Function
OldWindowProc в обоих случаях возвращает отрицательное значение и, как следствие, после вызова SetWindowLong Excel погибает. Для задания/получения других свойств окна, не GWL_WNDPROC, всё работает нормально.