public CaptureRegion(formCallBack fcb)
 {
     this.fcb = fcb;
     InitializeComponent();
     this.TopMost = true;
     this.Hide();
     _callback            = this.MouseMoveCallBack;
     this.BackColor       = Color.Aqua;
     this.TransparencyKey = Color.Aqua;
     this.Width           = 0;
     this.Height          = 0;
     _hook = MouseHook.SetWindowsHookEx(MouseHook.HookType.WH_MOUSE_LL, _callback, MouseHook.GetModuleHandle("user32"), 0);
     if (_hook == IntPtr.Zero)
     {
         throw new System.ComponentModel.Win32Exception();
     }
 }
 private IntPtr MouseMoveCallBack(int code, IntPtr wParam, IntPtr lParam)
 {
     if (code >= 0)
     {
         var WM_Code   = (MouseHook.WM_Codes)wParam;
         var mouseInfo = Marshal.PtrToStructure <MouseHook.MOUSEHOOKSTRUCT>(lParam);
         if (WM_Code == MouseHook.WM_Codes.WM_MOUSEMOVE)
         {
             OnMouseMove(mouseInfo);
         }
         if (WM_Code == MouseHook.WM_Codes.WM_LBUTTONDOWN)
         {
             OnLBtnClick();
         }
         if (WM_Code == MouseHook.WM_Codes.WM_LBUTTONUP)
         {
             OnLBtnUp();
         }
     }
     return(MouseHook.CallNextHookEx(IntPtr.Zero, code, wParam, lParam));
 }
 private void OnLBtnUp()
 {
     fcb(new Tuple <Point, Size>(new Point(this.Left, this.Top), Size));
     MouseHook.UnhookWindowsHookEx(_hook);
     this.Close();
 }