Событие мыши в консольном приложении - C#

Узнай цену своей работы

Формулировка задачи:

В консольном приложении реализовать вывод в нижнюю строку экрана символы, по которым производится «клик» левой кнопкой мыши. Выход из программы – одновременное нажатие правой кнопки и клавиши ALT Как это можно реализовать или подскажите где про это почитать. На MSDN очень скудно описано. Спасибо.

Решение задачи: «Событие мыши в консольном приложении»

textual
Листинг программы
  1. /* Low-Level Mouse Hook in C# (с) Stephen Toub - MSFT Thu, May 4 2006 1:57 AM */
  2. class InterceptMouse
  3. {
  4.     private static LowLevelMouseProc _proc = HookCallback;
  5.     private static IntPtr _hookID = IntPtr.Zero;
  6.  
  7.     public static void Main()
  8.     {
  9.         _hookID = SetHook(_proc);
  10.         Application.Run();
  11.         UnhookWindowsHookEx(_hookID);
  12.     }
  13.  
  14.     private static IntPtr SetHook(LowLevelMouseProc proc)
  15.     {
  16.         using (Process curProcess = Process.GetCurrentProcess())
  17.         using (ProcessModule curModule = curProcess.MainModule)
  18.         {
  19.             return SetWindowsHookEx(WH_MOUSE_LL, proc,
  20.                 GetModuleHandle(curModule.ModuleName), 0);
  21.         }
  22.     }
  23.  
  24.     private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
  25.  
  26.     private static IntPtr HookCallback(
  27.         int nCode, IntPtr wParam, IntPtr lParam)
  28.     {
  29.         if (nCode >= 0 &&
  30.             MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
  31.         {
  32.             MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
  33.             Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y);
  34.         }
  35.         return CallNextHookEx(_hookID, nCode, wParam, lParam);
  36.     }
  37.  
  38.     private const int WH_MOUSE_LL = 14;
  39.  
  40.     private enum MouseMessages
  41.     {
  42.         WM_LBUTTONDOWN = 0x0201,
  43.         WM_LBUTTONUP = 0x0202,
  44.         WM_MOUSEMOVE = 0x0200,
  45.         WM_MOUSEWHEEL = 0x020A,
  46.         WM_RBUTTONDOWN = 0x0204,
  47.         WM_RBUTTONUP = 0x0205
  48.     }
  49.  
  50.     [StructLayout(LayoutKind.Sequential)]
  51.     private struct POINT
  52.     {
  53.         public int x;
  54.         public int y;
  55.     }
  56.  
  57.     [StructLayout(LayoutKind.Sequential)]
  58.     private struct MSLLHOOKSTRUCT
  59.     {
  60.         public POINT pt;
  61.         public uint mouseData;
  62.         public uint flags;
  63.         public uint time;
  64.         public IntPtr dwExtraInfo;
  65.     }
  66.  
  67.     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  68.     private static extern IntPtr SetWindowsHookEx(int idHook,
  69.         LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
  70.  
  71.     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  72.     [return: MarshalAs(UnmanagedType.Bool)]
  73.     private static extern bool UnhookWindowsHookEx(IntPtr hhk);
  74.  
  75.     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  76.     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
  77.         IntPtr wParam, IntPtr lParam);
  78.  
  79.     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  80.     private static extern IntPtr GetModuleHandle(string lpModuleName);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы