Cómo establecer un enlace de Windows en Visual C# .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 318804 - Ver los productos a los que se aplica este artículo
Para obtener una versión de Microsoft Visual Basic de este artículo, consulte 319524.
Expandir todo | Contraer todo

En esta página

Introducción

En este artículo describe cómo establecer un enlace es específica para un subproceso y a un procedimiento de enlace mediante el enlace del mouse (ratón) como ejemplo. Puede utilizar enlaces para supervisar determinados tipos de eventos. Estos eventos se pueden asociar con un subproceso específico o con todos los subprocesos en el mismo escritorio como un subproceso de llamada.

Más información

Establecer un enlace de mouse

Para establecer un enlace, llamar la función de SetWindowsHookEx desde el archivo User32.dll. Esta función instala un procedimiento de enlace definidas por la aplicación en la cadena de enlace que está asociada con el enlace.

Para establecer un enlace de mouse (ratón) y para supervisar los eventos del mouse, siga estos pasos:
  1. Inicie Microsoft Visual Studio NET..
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual C# en Tipos de proyecto y, después, haga clic en Aplicación para Windows en plantillas . En el cuadro nombre , escriba ThreadSpecificMouseHook . De forma predeterminada, se crea un formulario que se denomina Form1.
  4. Agregue la línea siguiente de código en el archivo Form1.cs después de la otra mediante instrucciones.
    using System.Runtime.InteropServices;
  5. Agregar código en la clase de Form1 .
    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. Agregue un control Button al formulario y, a continuación, agregue el código siguiente en el procedimiento 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. Agregue el siguiente código para la función MouseHookProc en la clase de 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. Presione F5 para ejecutar el proyecto. Haga clic en el formulario para establecer el enlace en el botón. Las coordenadas del mouse aparecen en la barra de título del formulario cuando se mueve el puntero en el formulario. Haga clic en el botón nuevo para quitar el enlace.

No se admiten enlaces globales en .NET Framework

Excepto para el enlace de bajo nivel WH_KEYBOARD_LL y el enlace de bajo nivel WH_MOUSE_LL, no puede implementar enlaces globales en Microsoft .NET Framework. Para instalar un enlace global, un enlace debe tener una exportación DLL nativa para inyectar propio en otro proceso que requiere una función válida y coherente para llamar a. Este comportamiento requiere una exportación DLL. .NET Framework no admite exportaciones de DLL. Código administrado no tiene ningún concepto de un valor coherente para un puntero a función porque estos punteros de función son servidores proxy que se generan dinámicamente.

Se llama a procedimientos de enlace de bajo nivel en el subproceso que instala el enlace. Enlaces de bajo nivel no requieren que el procedimiento de enlace implementarse en un archivo DLL.

Referencias

Para obtener más información sobre enlaces, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/en-us/library/ms632589(VS.85).aspx

Propiedades

Id. de artículo: 318804 - Última revisión: lunes, 11 de diciembre de 2006 - Versión: 3.6
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbhowtomaster KB318804 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 318804

Enviar comentarios

 

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