Страница: 1 |
Страница: 1 |
Вопрос: Беда, ловля сообщений своего же окошка
Добавлено: 15.04.05 10:20
Автор вопроса: freeloader | Web-сайт:
Private Declare Function SetWindowLong Lib "user32.dll" _
Alias "SetWindowLongA" (ByVal hwnd As Int32, _
ByVal nIndex As Int32, _
ByVal dwNewLong As Int32) As Int32
Private Const GWL_WNDPROC As Int32 = -4
Private _OldWndProc As Int32
Private Sub cHotKey_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_OldWndProc = SetWindowLong(Me.HotKeyInheritedTextBox.Handle.ToInt32, _
GWL_WNDPROC, AddressOf EditWndProc)
End Sub
Почему глючит?
C:\Documents and Settings\freeloader\Мои документы\Visual Studio Projects\cHotKey\UserControl1.vb(76): 'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #1
Добавлено: 15.04.05 10:23
Блин просмотрел
Вот полный код:ll"
Private Declare Function SetWindowLong Lib "user32.dll" _
Alias "SetWindowLongA" (ByVal hwnd As Int32, _
ByVal nIndex As Int32, _
ByVal dwNewLong As Int32) As Int32
Private Const GWL_WNDPROC As Int32 = -4
Private _OldWndProc As Int32
Private Function EditWndProc(ByVal hEdit As Int32, ByVal uMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
End Function
Private Sub cHotKey_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_OldWndProc = SetWindowLong(Me.HotKeyInheritedTextBox.Handle.ToInt32, _
GWL_WNDPROC, AddressOf EditWndProc)
End Sub
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 15.04.05 12:02
Ну правильно всё...
Во-первых, чтобы передать из NET в API адрес функции, нужно объявить делегата правильного типа, объявить параметр функции с типом этого делегата, после чего передавать AddressOf. Только тогда .NET сможет осуществить маршалинг вызова...
Во-вторых, зачем тебе всё это, если есть событие WndProc?
Номер ответа: 3
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #3
Добавлено: 15.04.05 12:16
Вообще то то что ты написал я и сам то понял(в ошибке все расталковано)
Мне бы как сделать такое на Vb .NET
Пробовал еще сделать что то типа:
Private Delegate Function EditWndProc(ByVal hEdit As Int32, ByVal uMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
Но тогда уже возникает вот это:
C:\Documents and Settings\freeloader\Мои документы\Visual Studio Projects\cHotKey\UserControl1.vb(71): 'EditWndProc' is already declared as 'Delegate Function EditWndProc(hEdit As Integer, uMsg As Integer, wParam As Integer, lParam As Integer) As Integer' in this class.
Типа она уже объявлена и все такое... хрен поймешь чето...
Что за событие WNDProc?
У меня задача отлавливать сообщения посылаемые моему конкретному окошку в данном случае Edit'у, а остальное уже не суть важно.
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 15.04.05 13:31
В этом случае тебе нужно создать свой класс, унаследовать его от TextBox, переопределить в нем процедуру WndProc и использовать новый класс в своем приложени.
Приверно так:
Inherits System.Windows.Forms.TextBox
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_COMMAND
'Обработать сообщение WM_COMMAND
Case Else
'Предлать обработку сообщений дальше
MyBase.WndProc(m)
End Select
End Sub
End Class
В параметре m есть такие известные тебе св-ва как Msg, LParam, WParam и HWnd.
Номер ответа: 5
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #5
Добавлено: 15.04.05 15:36
Вот это то что мне надо,
всем спасибо!
Номер ответа: 6
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #6
Добавлено: 15.04.05 15:39
А хотя, вот если делать по другому, как это должно выглядеть вместе с этими делегатами?
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 15.04.05 15:59
Private Declare auto Function SetWindowProc Lib "user32.dll" Alias "SetWindowLong" (ByVal hwnd As IntPtr, ByVal nIndex As integer, ByVal dwNewLong As wndproc) As integer
.....
_OldWndProc = SetWindowLong (Me.HotKeyInheritedTextBox.Handle, GWL_WNDPROC, AddressOf EditWndProc)
Номер ответа: 8
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #8
Добавлено: 15.04.05 16:01
А сигнатура у WditWndProc должна быть
Или другая - но чтобы совпадала с делегатом.
Номер ответа: 9
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #9
Добавлено: 17.04.05 05:28
Спасибо!
Завтро буду со всеми этими делами разбираться!