ID do artigo: 319524 - Última revisão: segunda-feira, 19 de julho de 2010 - Revisão: 1.0

Como definir um gancho no Visual Basic.net

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para um Microsoft Visual c# versão deste artigo, consulte318804  (http://support.microsoft.com/kb/318804/ ) .

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como definir um gancho é específico para um thread e um procedimento de gancho. Este artigo usa o gancho do mouse como um exemplo.

Você pode usar os ganchos para monitorar certos tipos de eventos de . Você pode associar esses eventos com um segmento específico ou todos os threads que estão na mesma área de trabalho como um thread de chamada.

Mais Informações

Definir um gancho do mouse

Para definir um gancho, chame oSetWindowsHookExfunção do arquivo User32. dll. Esta função instala um procedimento de gancho de aplicativo definido na cadeia de gancho que está associada com a fixação.

Para definir um gancho do mouse e monitorar os eventos de mouse, siga estas etapas:
  1. Inicie o Microsoft Visual Studio .net.
  2. Sobre oArquivoaponte paraNovoe, em seguida, clique emProjeto.
  3. NoNovo projetocaixa de diálogo, clique emProjetos do Visual BasicemTipos de projeto. Em seguida, clique emAplicativo do WindowsemModelos.
  4. NoNomecaixa, digiteThreadSpecificMouseHook. Por padrão, um formulário é denominado Form1 é criado.
  5. No início do arquivo Form1. vb, cole o código a seguir.
    Imports System.Runtime.InteropServices
    Public Delegate Function CallBack( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As Integer
  6. NoForm1classe, cole o código a seguir.
    'Declare the mouse hook constant.
    'For other hook types, obtain these values from Winuser.h in Microsoft SDK.
        Dim WH_MOUSE As Integer = 7
        Shared hHook As Integer = 0
    
        'Keep the reference so that the delegate is not garbage collected.
        Private hookproc As CallBack
    
        'Import for the SetWindowsHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
         Public Overloads Shared Function SetWindowsHookEx _
              (ByVal idHook As Integer, ByVal HookProc As CallBack, _
               ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
        End Function
    
        'Import for the CallNextHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
         Public Overloads Shared Function CallNextHookEx _
              (ByVal idHook As Integer, ByVal nCode As Integer, _
               ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
        End Function
        'Import for the UnhookWindowsHookEx function.
        <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
             Public Overloads Shared Function UnhookWindowsHookEx _
                  (ByVal idHook As Integer) As Boolean
        End Function
    
        'Point structure declaration.
        <StructLayout(LayoutKind.Sequential)> Public Structure Point
            Public x As Integer
            Public y As Integer
        End Structure
    
        'MouseHookStruct structure declaration.
        <StructLayout(LayoutKind.Sequential)> Public Structure MouseHookStruct
            Public pt As Point
            Public hwnd As Integer
            Public wHitTestCode As Integer
            Public dwExtraInfo As Integer
        End Structure
  7. Adicionar um botão ao formulário. Em seguida, cole o seguinte código noButton1_Clickprocedimento.
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If hHook.Equals(0) Then
                hookproc = AddressOf MouseHookProc
                hHook = SetWindowsHookEx(WH_MOUSE, _
                                         hookproc, _
                                         IntPtr.Zero, _
    AppDomain.CurrentDomain.GetCurrentThreadId())
                If hHook.Equals(0) Then
                    MsgBox("SetWindowsHookEx Failed")
                    Return
                Else
                    Button1.Text = "UnHook Windows Hook"
                End If
            Else
                Dim ret As Boolean = UnhookWindowsHookEx(hHook)
    
                If ret.Equals(False) Then
                    MsgBox("UnhookWindowsHookEx Failed")
                    Return
                Else
                    hHook = 0
                    Button1.Text = "Set Windows Hook"
                    Me.Text = "Mouse Hook"
                End If
            End If
    
        End Sub
  8. NoForm1da classe, cole o seguinte código para oMouseHookProcfunção.
        Public Shared Function MouseHookProc( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As Integer
    Dim MyMouseHookStruct As New MouseHookStruct()
    
            Dim ret As Integer
    
            If (nCode < 0) Then
                Return CallNextHookEx(hHook, nCode, wParam, lParam)
            End If
    
            MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseHookStruct)
    
            Dim tempForm As Form
            tempForm = Form.ActiveForm()
    
            Dim strCaption As String
            strCaption = "x = " & MyMouseHookStruct.pt.x & " y = " & MyMouseHookStruct.pt.y
    
            tempForm.Text = strCaption
            Return CallNextHookEx(hHook, nCode, wParam, lParam)
    
        End Function
  9. Pressione F5 para executar o projeto. Clique no botão no formulário para definir o gancho. As coordenadas do ponteiro exibido na barra de legenda do formulário quando o ponteiro se move no formulário.
  10. Clique no botão novamente para remover o gancho.

Ganchos globais não são suportados no .NET Framework

Não é possível implementar ganchos globais no .NET Framework. Ganchos de nível inferior executado no processo do chamador. Essas conexões não exigem que o código é injetado em outros processos. Eles podem ser implementados em código gerenciado, mas não pode continuar trabalhando. Porque cada evento de entrada deve aguardar o gancho do nível inferior voltar, antes do gancho é enviado, o conexões lentas podem interferir significativamente a capacidade de resposta do sistema. O Windows silenciosamente remove qualquer gancho leva muito tempo para processar. Como código gerenciado não é possível controlar o momento em que o coletor de lixo é executado, não há nenhuma garantia de que o procedimento de gancho sempre retornará rápido o suficiente para evitar que está sendo removida.

Referências

Para obter mais informações sobre os ganchos, visite o seguinte site da MSDN (Microsoft Developer Network):
http://msdn.microsoft.com/en-us/library/ms644959.aspx (http://msdn.microsoft.com/en-us/library/ms644959.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbhowtomaster kbmt KB319524 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 319524  (http://support.microsoft.com/kb/319524/en-us/ )