Como definir uma rotina de Windows no Visual C# .NET

Traduções de Artigos Traduções de Artigos
Artigo: 318804 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft Visual Basic versão deste artigo, consulte 319524.
Expandir tudo | Reduzir tudo

Nesta página

Introdução

Este artigo descreve como definir uma rotina que é específica para um thread e um procedimento de rotina utilizando o hook do rato como um exemplo. Pode utilizar rotinas para monitorizar determinados tipos de eventos. Pode associar estes eventos com um tópico específico ou com todos os threads do mesmo ambiente de trabalho como um thread de chamada.

Mais Informação

Definir uma rotina de rato

Para definir uma rotina, chama a função SetWindowsHookEx a partir do ficheiro User32.dll. Esta função instala um procedimento de rotina definidas pela aplicação na cadeia de rotina associada a rotina.

Para definir uma rotina do rato e para monitorizar os eventos de rato, siga estes passos:
  1. Inicie o Microsoft Visual Studio NET..
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Na caixa de diálogo Novo projecto , clique em Visual C# Projects em Project Types e, em seguida, clique em Aplicação do Windows em modelos . Na caixa nome , escreva ThreadSpecificMouseHook . Por predefinição, é criado um formulário é denominado Form1.
  4. Adicionar a seguinte linha de código no ficheiro de Form1.cs depois do outro utilizando instruções.
    using System.Runtime.InteropServices;
  5. Adicionar seguinte código de Form1 class.
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    
    //Declare the hook handle as an int.
    static int hHook = 0;
    
    //Declare the mouse hook constant.
    //For other hook types, you can obtain these values from Winuser.h in the Microsoft SDK.
    public const int WH_MOUSE = 7;
    private System.Windows.Forms.Button button1;
    
    //Declare MouseHookProcedure as a HookProc type.
    HookProc MouseHookProcedure;			
    
    //Declare the wrapper managed POINT class.
    [StructLayout(LayoutKind.Sequential)]
    public class POINT 
    {
    	public int x;
    	public int y;
    }
    
    //Declare the wrapper managed MouseHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public class MouseHookStruct 
    {
    	public POINT pt;
    	public int hwnd;
    	public int wHitTestCode;
    	public int dwExtraInfo;
    }
    
    //This is the Import for the SetWindowsHookEx function.
    //Use this function to install a thread-specific hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, 
    IntPtr hInstance, int threadId);
    
    //This is the Import for the UnhookWindowsHookEx function.
    //Call this function to uninstall the hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);
    		
    //This is the Import for the CallNextHookEx function.
    //Use this function to pass the hook information to the next hook procedure in chain.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode, 
    IntPtr wParam, IntPtr lParam);
  6. Adicionar um controlo botão ao formulário e, em seguida, adicione o seguinte código no procedimento Button1_click .
    private void button1_Click(object sender, System.EventArgs e)
    {
    	if(hHook == 0)
    	{
    	        // Create an instance of HookProc.
    		MouseHookProcedure = new HookProc(Form1.MouseHookProc);
    				
    		hHook = SetWindowsHookEx(WH_MOUSE, 
    					MouseHookProcedure, 
    					(IntPtr)0,
    					AppDomain.GetCurrentThreadId());
    		//If the SetWindowsHookEx function fails.
    		if(hHook == 0 )
    		{
    			MessageBox.Show("SetWindowsHookEx Failed");
    			return;
    		}
    		button1.Text = "UnHook Windows Hook";
    	}
    	else
    	{
    		bool ret = UnhookWindowsHookEx(hHook);
    		//If the UnhookWindowsHookEx function fails.
    		if(ret == false )
    		{
    			MessageBox.Show("UnhookWindowsHookEx Failed");
    			return;
    		}
    		hHook = 0;
    		button1.Text = "Set Windows Hook";
    		this.Text = "Mouse Hook";
    	} 
    }
  7. Adicione o seguinte código para a função MouseHookProc class. o Form1
    public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
    	//Marshall the data from the callback.
    	MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
    
    	if (nCode < 0)
    	{
    		return CallNextHookEx(hHook, nCode, wParam, lParam);
    	}
    	else
    	{
    		//Create a string variable that shows the current mouse coordinates.
    		String strCaption = "x = " + 
    				MyMouseHookStruct.pt.x.ToString("d") + 
    					"  y = " + 
    		MyMouseHookStruct.pt.y.ToString("d");
    		//You must get the active form because it is a static function.
    		Form tempForm = Form.ActiveForm;
            
    		//Set the caption of the form.
    		tempForm.Text = strCaption;
    		return CallNextHookEx(hHook, nCode, wParam, lParam); 
    	}
    }
  8. Prima F5 para executar o projecto. Clique no botão no formulário para definir a rotina. As coordenadas do rato aparecem na barra legenda formulário quando move o ponteiro no formulário. Clique no botão novamente para remover a rotina.

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

Excepto para a rotina de baixo nível WH_KEYBOARD_LL e a rotina de baixo nível WH_MOUSE_LL, não pode implementar rotinas globais no Microsoft .NET Framework. Para instalar uma rotina global, uma rotina tem de ter uma exportação DLL nativa para injectar próprio em outro processo que requer uma função válida e consistente para chamam. Este comportamento requer uma exportação DLL. O .NET Framework não suporta DLL exporta. Código gerido tem não conceito de um valor consistente para um apontador de função, porque estes apontadores para função proxies que são criados de forma dinâmica.

Procedimentos de rotina de baixo nível denominam-se no thread instalada a rotina. Rotinas de nível inferior não são necessário que o procedimento da rotina ser implementado numa DLL.

Referências

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

Propriedades

Artigo: 318804 - Última revisão: 11 de dezembro de 2006 - Revisão: 3.6
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 C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbhowtomaster KB318804 KbMtpt
Traduçã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: 318804

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com