Ответ 1
Вам нужно написать крючок для мыши, если вы хотите перехватить щелчки мышью, перемещение, щелчки колеса мыши... и т.д.
Это единственный способ AFAIK, если вы хотите отслеживать активность мыши вне вашего собственного приложения. Вам нужно импортировать функцию SetWindowsHookEx (...) из файла User32.dll, если вы хотите установить крючок. Он включает interop (PInvoke), и вам придется импортировать (DllImport) некоторые функции.
Вот официальный документ Microsoft о том, как добиться этого в С#:
Как установить крючок Windows в Visual С#.NET
Я обобщу его здесь, чтобы закончить ответ, если связь однажды умрет.
Начиная с функции SetWindowsHookEx:
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);
Теперь вы можете настроить свой крючок. Например:
public class Form1
{
static int hHook = 0;
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
HookProc MouseHookProcedure;
private void ActivateMouseHook_Click(object sender, System.EventArgs e)
{
if(hHook == 0)
{
MouseHookProcedure = new HookProc(Form1.MouseHookProc);
hHook = SetWindowsHookEx(WH_MOUSE,
MouseHookProcedure,
(IntPtr) 0,
AppDomain.GetCurrentThreadId());
}
}
}
Не забудьте отцепить его потом. Для этого вам понадобится другой DllImport:
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
private void DeactivateMouseHook_Click(object sender, System.EventArgs e)
{
bool ret = UnhookWindowsHookEx(hHook);
}
Вы можете использовать делегат HookProc (MouseHookProcedure) для захвата активности мыши. Это предполагает некоторую сортировку для сбора данных.
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
MouseHookStruct MyMouseHookStruct = (MouseHookStruct)
Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
// You can get the coördinates using the MyMouseHookStruct.
// ...
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
Не забудьте впоследствии вызвать следующий элемент в цепочке крюков (CallNextHookEx)!
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
IntPtr wParam, IntPtr lParam);
PS: Вы можете сделать то же самое для клавиатуры.