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

Para obtener una versión de Microsoft Visual Basic de este artículo, consulte 319524 .

Introducción

Este artículo describe cómo establecer un enlace que es específico para un subproceso y a un procedimiento de enlace mediante el gancho del mouse como un ejemplo. Puede utilizar ganchos 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, llame a la función SetWindowsHookEx desde el archivo User32.dll. Esta función instala un procedimiento de enlace definido por la aplicación en la cadena de enlace que está asociada el gancho.

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, elija 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 proyectoy, a continuación, haga clic en Aplicación para Windows en plantillas. En el cuadro nombre , escriba ThreadSpecificMouseHook. De forma predeterminada, se crea un formulario denominado Form1.
  4. Agregue la siguiente línea de código en el archivo Form1.cs después de las instrucciones using .
    using System.Runtime.InteropServices;
  5. Agregue el siguiente código en la clase 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. En la clase Form1 , agregue el código siguiente para la función MouseHookProc .
    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 botón en el formulario para establecer el enlace. 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.

Enlaces globales no son compatibles con el.NET Framework

Excepto el gancho del bajo nivel WH_KEYBOARD_LL y el gancho del bajo nivel WH_MOUSE_LL, no puede implementar enlaces globales en el.NET Framework de Microsoft. Para instalar una conexión global, un enlace debe tener una exportación DLL nativa para inyectar a sí mismo en otro proceso que requiere una función válida y coherente para llamar a. Este comportamiento requiere una exportación DLL. El.NET Framework no admite las exportaciones 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 genera dinámicamente.

Procedimientos de bajo nivel de enlace se denominan en el subproceso que ha había instalado el gancho. Ganchos de bajo nivel no requieren que el procedimiento de enlace se implementa en un archivo DLL.

Referencias

Para obtener más información sobre enlaces, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

Propiedades

Id. de artículo: 318804 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios