Artigo: 319524 - Última revisão: segunda-feira, 19 de Julho de 2010 - Revisão: 1.0

Como definir uma rotina do 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.
Versão para a Microsoft Visual c# deste artigo, consulte318804  (http://support.microsoft.com/kb/318804/ ) .

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como definir uma rotina que é específica para um thread de e para um procedimento da rotina. Este artigo utiliza o hook do rato como um exemplo.

Pode utilizar ganchos para monitorizar determinados tipos de eventos. Pode associar estes eventos com um tópico específico ou com todos os threads que estão no mesmo ambiente de trabalho como um thread chamada.

Mais Informação

Definir uma rotina de rato

Para definir uma rotina, chame oSetWindowsHookExfunção do ficheiro User32. dll. Esta função instala um procedimento da rotina definidas pela aplicação da cadeia de rotina associada a hook.

Para definir uma rotina de rato e monitorizar os eventos de rato, siga estes passos:
  1. Inicie o Microsoft Visual Studio .NET.
  2. Sobre oFicheiromenu, aponte paraNovoe, em seguida, clique emProjecto.
  3. NoNovo projectocaixa de diálogo, clique emProjectos do Visual BasicemTipos de projecto. Em seguida, clique emAplicação do WindowsemModelos.
  4. NoNomeEscrevaThreadSpecificMouseHook. Por predefinição, é criado um formulário é denominado Form1.
  5. No início do ficheiro Form1. vb, cole o seguinte código.
    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 seguinte código.
    '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. NoForm1classe, 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. Prima F5 para executar o projecto. Clique no botão no formulário para definir o hook. As coordenadas do ponteiro aparecem na barra de legenda formulário quando move o ponteiro no formulário.
  10. Clique novamente no botão para remover o hook.

Rotinas globais não são suportadas no .NET Framework

Não podem implementar rotinas globais no .NET Framework. Ganchos de nível inferior executados no processo do autor da chamada. Estas rotinas não requerem que o código é injectado em outros processos. Estes podem ser implementadas em código gerido, mas não podem continuar a trabalhar. Uma vez que cada evento de entrada tem de esperar gancho de baixo nível regressar antes do gancho é distribuído, ganchos lentos significativamente podem interferir com a capacidade de resposta do sistema. Windows remove silenciosamente qualquer rotina demora demasiado tempo a processar. Uma vez que o código gerido não consegue controlar o momento em que é executado o recolector de dados não utilizados, não é garantido que o procedimento da rotina devolverá sempre suficientemente rápido para evitar a ser removido.

Referências

Para mais informações sobre como ganchos, visite o seguinte Web 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )