none
Se detecto Callbackoncollecteddelegate [Solucionado]

    Pregunta

  • Hola A todos,

    he utilizado un codigo para bloquear las teclas del teclado, y funciona bien, pero cuando pasa x tiempo el delegado falla y da error de CallbackOnColletedDelegate, como puedo controlar este error para que no falle? Este es el codigo que uso en el form,

    Public Class FormInicial
        Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProcDelegate,
        ByVal hMod As IntPtr, ByVal dwThreadId As Integer) As Integer
        Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHook As IntPtr) As Boolean
        Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As Integer,
        ByRef lParam As KBDLLHOOKSTRUCT) As Integer
        Delegate Function LowLevelKeyboardProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
        Const WH_KEYBOARD_LL As Integer = 13

        Structure KBDLLHOOKSTRUCT
            Dim vkCode As Integer
            Dim scanCode As Integer
            Dim flags As Integer
            Dim time As Integer
            Dim dwExtraInfo As Integer
        End Structure


        Public Sub QuitaTeclado()
            Try


                BUTTONtodas.ForeColor = Color.Red
                Presiontecla = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, IntPtr.Zero, 0)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

        
        Public Function LowLevelKeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer

            Try

                Dim ALTTAB As Boolean = ((lParam.vkCode = 9) AndAlso (lParam.flags = 32))
                Dim ALTESC As Boolean = ((lParam.vkCode = 27) AndAlso (lParam.flags = 32))
                Dim CTRLESC As Boolean = ((lParam.vkCode = 27) AndAlso (lParam.flags = 0))
                Dim WIN As Boolean = ((lParam.vkCode = 91) AndAlso (lParam.flags = 1)) Or ((lParam.vkCode = 92) AndAlso (lParam.flags = 1))
                Dim ALTV As Boolean = ((lParam.vkCode = 88) AndAlso (lParam.flags = 32))
                Dim TODAS As Boolean = ((lParam.vkCode = 9) AndAlso (lParam.flags = 32)) Or ((lParam.vkCode = 27) AndAlso (lParam.flags = 32)) Or
                ((lParam.vkCode = 27) AndAlso (lParam.flags = 0)) Or ((lParam.vkCode = 91) AndAlso (lParam.flags = 1)) Or ((lParam.vkCode = 92) AndAlso (lParam.flags = 1))

               

                Select Case True
                    Case ALTTAB
                        BUTTONtodas.ForeColor = Color.Red
                        Return 1
                    Case ALTESC
                        BUTTONtodas.ForeColor = Color.Red
                        Return 1
                    Case CTRLESC
                        BUTTONtodas.ForeColor = Color.Red
                        Return 1
                    Case WIN
                        BUTTONtodas.ForeColor = Color.Red
                        Return 1
                    Case ALTV
                        BUTTONtodas.ForeColor = Color.Black
                        ' MsgBox("El Teclado ha sido desbloqueado, la Aplicación está liberada.", MsgBoxStyle.Information)
                        FormEspera.Show()
                        UnhookWindowsHookEx(Presiontecla)
                    
                    Case Else

                End Select

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Return 1
        End Function

        Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            UnhookWindowsHookEx(Presiontecla)
        End Sub
        Dim a As Integer
        Private Sub EspecificaBoton()
            ButtonsImg.Size = New Point(117, 117)
            ButtonsImg.Top = ButtonsImg.Height * PintaA
            ButtonsImg.FlatStyle = FlatStyle.Flat
            ButtonsImg.FlatAppearance.BorderSize = 0
        End Sub


        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

            Call PantallaCargada()


            DesdeApp() ' Titulo de la portada
            Caminos()  ' Ruta del Directorio Documentos
            Iconoretroceso.Visible = False
            Label2.Visible = False

            StartPosition = FormStartPosition.CenterScreen
            veces = 1 ' Iniciamos con el valor 1

            TextUser.Text = Environ$("USERNAME")




            BUTTONtodas.ForeColor = Color.Red
            Presiontecla = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, IntPtr.Zero, 0)

    Como puedo controlar ese Bug

    Gracias  

    un saludo


    • Editado Andiamos miércoles, 15 de marzo de 2017 9:37
    miércoles, 15 de marzo de 2017 8:39

Respuestas

  • Cambiar

    Presiontecla = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, IntPtr.Zero, 0)

    Por 

     Me.Presiontecla = FormInicial.SetWindowsHookEx(13, New FormInicial.LowLevelKeyboardProcDelegate(AddressOf LowLevelKeyboardProc), IntPtr.Zero, 0)

    Y después mantenerlo siempre activo:

    Un saludo

    • Marcado como respuesta Andiamos miércoles, 15 de marzo de 2017 9:39
    miércoles, 15 de marzo de 2017 9:39