Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Беда, ловля сообщений своего же окошка Добавлено: 15.04.05 10:20  

Автор вопроса:  freeloader  | Web-сайт: freeloader.folder-pro.net | ICQ: 50804884 

 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-сайт: freeloader.folder-pro.net
 Профиль | | #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-сайт: freeloader.folder-pro.net
 Профиль | | #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 и использовать новый класс в своем приложени.
Приверно так:

Public Class CoolTextBox
    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-сайт: freeloader.folder-pro.net
 Профиль | | #5
Добавлено: 15.04.05 15:36

Вот это то что мне надо,
всем спасибо!

Ответить

Номер ответа: 6
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #6
Добавлено: 15.04.05 15:39
А хотя, вот если делать по другому, как это должно выглядеть вместе с этими делегатами?

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 15.04.05 15:59
public delegate function WndProc(byval hWnd as IntPtr, byval uMsg as integer, byval wParam as integer, byval lParam as integer) as integer

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 должна быть
(byval hWnd as IntPtr, byval uMsg as integer, byval wParam as integer, byval lParam as integer) as integer



Или другая - но чтобы совпадала с делегатом.

Ответить

Номер ответа: 9
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #9
Добавлено: 17.04.05 05:28
Спасибо!
Завтро буду со всеми этими делами разбираться!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам