.NET 2008 Subclassingproblem

Verata

Enthusiast
Thread Starter
Mitglied seit
25.09.2009
Beiträge
233
Hi,
ich bastel im Moment eine Klasse um das Mausrad subclassen zu können. Mein Code funktioniert auch im Allgemeinen ganz gut, mein Event wird ausgelöst und die Eventhandler Werte sind richtig. Leider habe ich die Rechnung ohne die Garbage Collection gemacht. Ich benötige zwei Delegates und dem WindowHook eine gültige Funktionsadresse geben zu können, da MS leider AdressOf seit VB6 rausgeschmissen hat. Nach einer mehr oder weniger zufälligen Zeit entfernt die Garbage Collection eines der Delegates, Windows überprüft die Rücksprungadresse bevor sie die Funktion auslöst, findet sie nicht und schießt mein Programm wegen eines invaliden Subclassinghandlers ab. Die einzige Methode die bis dato geholfen hat, ist eine Instanz der Klasse immer nur für wenige Sekunden zu benutzen und dann zu Reinstanziren. Das ist aber 1. langsam und 2. habe ich dann immer kurze Löcher in der Eventabfrage. Folglich scheidet diese Lösung aus. Also kurz und bündig:
Wie kann ich ohne permanente neu-Instanzierung die Garbage Collection von ihrem Job abhalten?
Vielen Dank für eure Hilfe.
mfg Verata


PS: Ich code in VB was aber auf Grund der Tatsache, das es sich um NET handelt keine Rolle spielen dürfte.
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
AddressOf gibts doch im VB weiterhin. In der Hilfe steht sogar was zu AddressOf und Delegates.

Das sollte dein Problem irgendwie lösen. Ansonsten mal die entsprechenden Codefragmente posten !
 
Mit meinem Kommentar zu Adress of meinte ich, das ich den Befehl nicht mehr einfach auf eine Funktion anwenden darf. Ich muss sie jetzt auf ein Delegate anwenden. Das ist der gesammte Code der Klasse:
Code:
Public Class ClsMouseWheel
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As DelegateMouseProc, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer

    Public Declare Function GetCurrentThreadId Lib "kernel32" () As Integer

    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MOUSEHOOKSTRUCT) As Integer

    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer

    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal MSG As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As DelegateWindowProc) As Integer


    Public Structure POINTAPI
        Dim X As Integer
        Dim Y As Integer
    End Structure

    Public Structure MOUSEHOOKSTRUCT
        Dim pt As POINTAPI
        Dim hWnd As Integer
        Dim wHitTestCode As Integer
        Dim dwExtraInfo As Integer
    End Structure

    Private Const WM_MOUSEWHEEL As Integer = &H20A
    Private Const WM_MBUTTONUP As Integer = &H208
    Private Const WM_MBUTTONDOWN As Integer = &H207
    Private Const WM_MBUTTONDBLCLK As Integer = &H209
    Private Const WM_LBUTTONDOWN As Integer = &H201
    Private Const WM_LBUTTONUP As Integer = &H202

    Private Const MK_LBUTTON As Integer = &H1
    Private Const MK_MBUTTON As Integer = &H10
    Private Const MK_RBUTTON As Integer = &H2

    Public Const WH_MOUSE As Short = 7
    Private Const WHEEL_DELTA As Short = 120

    Public Const GWL_WNDPROC As Short = -4

    Dim hook As Integer
    Dim Delta As Integer
    Dim OriginalWindowProc As Integer

    Private Form As System.Windows.Forms.Form

    Public Delegate Function DelegateMouseProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MOUSEHOOKSTRUCT) As Integer


    Private Function MouseProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MOUSEHOOKSTRUCT) As Integer
        If nCode < 0 Then
            MouseProc = CallNextHookEx(hook, nCode, wParam, lParam)
        End If
    End Function

    Public Delegate Function DelegateWindowProc(ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer


    Private Function WindowProc(ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        Select Case uMsg
            Case WM_MOUSEWHEEL
                Delta = wParam / 65536 / WHEEL_DELTA
                MouseWheelRotation(Delta, hWnd)
                Debug.Print("Delta:" & Delta)
        End Select

        WindowProc = CallWindowProc(OriginalWindowProc, hWnd, uMsg, wParam, lParam)
    End Function


    Private Sub Init()
        hook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0, GetCurrentThreadId)
        OriginalWindowProc = SetWindowLong(Form.Handle.ToInt32, GWL_WNDPROC, AddressOf WindowProc)
    End Sub

    public Sub Ende()
        UnhookWindowsHookEx(hook)
    End Sub

    Private Sub MouseWheelRotation(ByRef Richtung As Integer, ByRef hWnd As Integer)
        Form1.Label1.Text = Delta


    End Sub

    Public ReadOnly Property Wheel() As Integer
        Get

            Return Delta
        End Get
    End Property

    Public Sub New(ByVal Host As Form)
        Form = Host
        Init()
    End Sub

End Class
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh