j0lama, deber utilizar las etiquetas para insertar código, lee mi firma y las reglas del foro de programación.
Es bastante más complicado que el pseudo-código que has mostrado de ejemplo.
Debes crear un hook de bajo nivel o bien puedes registrar el dispositivo del mouse mediante el modelo
RAWINPUT.
Ejemplo de uso:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public sealed class Form1 : Form
{
private MouseHook withEventsField_mouseEvents
= new MouseHook
(Install
: false); private MouseHook mouseEvents {
get { return withEventsField_mouseEvents; }
set {
if (withEventsField_mouseEvents != null) {
withEventsField_mouseEvents.MouseLeftDown -= MouseEvents_MouseLeftDown;
}
withEventsField_mouseEvents = value;
if (withEventsField_mouseEvents != null) {
withEventsField_mouseEvents.MouseLeftDown += MouseEvents_MouseLeftDown;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
// Install Mouse Hook on the System.
this.mouseEvents.Install();
// Start processing mouse events.
this.mouseEvents.Enable();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Stop processing mouse events.
this.mouseEvents.Disable();
// Uninstall the mouse hook from system.
this.mouseEvents.Uninstall();
}
private void MouseEvents_MouseLeftDown(object sender)
{
Trace.WriteLine(string.Format("Mouse Left Down"));
}
public Form1()
{
FormClosing += Form1_FormClosing;
Load += Form1_Load;
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================
Código fuente destripado para cumplir la función que mencionas, y convertido a C# (puede no haberse convertido correctamente):
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
#region " Instructions "
// Go to page:
// Project > Properties > Debug
//
// Then uncheck the option:
// "Enable the Visual Studio Hosting Process"
#endregion
#region " Imports "
using System.Reflection;
using System.Runtime.InteropServices;
#endregion
#region " MouseHook "
/// <summary>
/// A low level mouse hook that processes mouse input events.
/// </summary>
internal sealed class MouseHook : IDisposable
{
#region " P/Invoke "
protected sealed class NativeMethods
{
#region " Methods "
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx(HookType idHook, LowLevelMouseProcDelegate lpfn, IntPtr hInstance, uint threadId);
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(IntPtr idHook);
#endregion
#region " Enumerations "
public enum WindowsMessages : uint
{
WMlButtonDown = 0x201u
}
public enum HookType : uint
{
WHMouseLL = 14u
}
[Flags()]
public enum MsllHookStructFlags : int
{
LlmhfInjected = 1,
LlmhfLowerILInjected = 2
}
#endregion
#region " Delegates "
public delegate int LowLevelMouseProcDelegate(int nCode, NativeMethods.WindowsMessages wParam, IntPtr lParam);
#endregion
}
#endregion
#region " Properties "
/// <summary>
/// Handle to the hook procedure.
/// </summary>
private IntPtr MouseHook { get; set; }
/// <summary>
/// The mouse hook delegate.
/// </summary>
private NativeMethods.LowLevelMouseProcDelegate MouseHookDelegate { get; set; }
#endregion
#region " Events "
/// <summary>
/// Occurs when the mouse left button is pressed.
/// </summary>
public event MouseLeftDownEventHandler MouseLeftDown;
public delegate void MouseLeftDownEventHandler(object sender);
#endregion
#region " Constructors "
/// <summary>
/// Initializes a new instance of the <see cref="MouseHook"/> class.
/// </summary>
/// <param name="Install">
/// If set to <c>true</c>, the Hook starts initialized for this <see cref="MouseHook"/> instance.
/// </param>
public MouseHook(bool install = false)
{
if (install) {
this.Install();
}
}
#endregion
#region " Public Methods "
/// <summary>
/// Installs the Mouse Hook, then start processing messages to fire events.
/// </summary>
public void Install()
{
if (this.IsVisualStudioHostingProcessEnabled()) {
throw new Exception
("Visual Studio Hosting Process should be deactivated."); return;
}
this.MouseHookDelegate = new NativeMethods
.LowLevelMouseProcDelegate(LowLevelMouseProc
);
try {
this.MouseHook = NativeMethods
.SetWindowsHookEx(NativeMethods
.HookType.WHMouseLL,
this.MouseHookDelegate,
new IntPtr
(Marshal
.GetHINSTANCE(Assembly
.GetExecutingAssembly.GetModules()(0)).ToInt32),
0);
} catch (Exception ex) {
throw;
}
}
/// <summary>
/// Uninstalls the Mouse Hook and free all resources, then stop processing messages to fire events.
/// </summary>
public void Uninstall()
{
this.Finalize();
}
#endregion
#region " Private Methods "
private bool IsVisualStudioHostingProcessEnabled()
{
return AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe", StringComparison.OrdinalIgnoreCase);
}
private int LowLevelMouseProc(int nCode, NativeMethods.WindowsMessages wParam, IntPtr lParam)
{
if (nCode == 0) {
switch (wParam) {
case NativeMethods.WindowsMessages.WMlButtonDown:
if (MouseLeftDown != null) {
MouseLeftDown(this);
}
break;
default:
// Do Nothing
break; // TODO: might not be correct. Was : Exit Select
break;
}
return Convert
.ToInt32(NativeMethods
.CallNextHookEx(MouseHook, nCode,
new IntPtr
(wParam
), lParam
));
} else if (nCode < 0) {
return Convert
.ToInt32(NativeMethods
.CallNextHookEx(MouseHook, nCode,
new IntPtr
(wParam
), lParam
));
// nCode > 0
} else {
return Convert
.ToInt32(NativeMethods
.CallNextHookEx(MouseHook, nCode,
new IntPtr
(wParam
), lParam
));
}
}
#endregion
#region "IDisposable Support"
/// <summary>
/// Flag to detect redundant calls at <see cref="Dispose"/> method.
/// </summary>
private bool disposedValue;
protected void Dispose(bool disposing)
{
if (!this.disposedValue) {
// Dispose managed state (managed objects).
if (disposing) {
// Free unmanaged resources (unmanaged objects).
} else {
NativeMethods.UnhookWindowsHookEx(this.MouseHook);
}
}
this.disposedValue = true;
}
protected override void Finalize()
{
// Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)
this.Dispose(disposing: false);
base.Finalize();
}
private void Dispose()
{
// Do not change this code. Put cleanup code in method: Dispose(ByVal disposing As Boolean)
this.Dispose(disposing: true);
GC.SuppressFinalize(obj: this);
}
#endregion
}
#endregion
//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================
Código fuente original y documentado de pies a cabeza, en VB.Net:
➢
http://pastebin.com/Bjr06jGRSi quieres ver un ejemplo de como sería usando
RAWINPUT, puedes hacerte una idea aquí:
➢
[SOURCE] Algoritmo KeyLogger (RawInput) - By ElektroSaludos.