/// <summary> /// Callback функция для хука -- прослушивание событий мыши. /// </summary> private int MouseCallbackFunctionListener(int code, IntPtr wParam, IntPtr lparam) { MSLLHOOKSTRUCT mouseInfo = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lparam, typeof(MSLLHOOKSTRUCT)); // Инициализируем новый итем ActionLogger.UserAction uaMouse = new ActionLogger.UserAction(); System.Windows.Forms.Message msg = new System.Windows.Forms.Message(); msg.Msg = wParam.ToInt32(); if (msg.Msg == WM_LBUTTONDOWN || msg.Msg == WM_LBUTTONUP) { //Записываем координаты мыши в DWORD uint MousePt = unchecked( (uint)((uint)mouseInfo.pt.Y << 16) | (uint)mouseInfo.pt.X); System.Drawing.Point pt = new System.Drawing.Point(mouseInfo.pt.X, mouseInfo.pt.Y); //Рекурсивно находим самое нижнее из всех дочерних окон, в котором находится наша точка IntPtr OldWnd = weFinder.ParentHandle; IntPtr OldCWnd = IntPtr.Zero; IntPtr hwnd = weFinder.FindWindowAtPos(pt); while (hwnd != IntPtr.Zero) { OldCWnd = hwnd; weFinder.ParentHandle = hwnd; hwnd = weFinder.FindWindowAtPos(pt); } weFinder.ParentHandle = OldWnd; hwnd = OldCWnd; if (hwnd != IntPtr.Zero) { //Получаем текст окна int len = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, new StringBuilder()).ToInt32()+1; StringBuilder strWindowText = new StringBuilder(len); SendMessage(hwnd, WM_GETTEXT, len , strWindowText); uaMouse.BriefInfo = strWindowText.ToString() + ":"; // Получаем класс окна StringBuilder strWindowClass = new StringBuilder(128); WindowsEnumerator.GetClassName(hwnd,strWindowClass,128); uaMouse.BriefInfo += strWindowClass.ToString(); //Формирует ординарное сообщение Windows для помещения в хранилище IntPtr PtrToPt = new IntPtr(MousePt); msg.LParam = PtrToPt; msg.WParam = new IntPtr(1); uaMouse.KeyCode = (mouseInfo.mouseData >> 16); uaMouse.EventCode = msg; uaMouse.ThreadId = this.ThreadId; //Записываем новый итем в модель. ActionHost.AddItem(uaMouse); } } // Передаем управление следующему хуку, если такой есть в системе. return CallNextHookEx(IntPtr.Zero, code, wParam, lparam); }
/// <summary> /// Каллбэк функция для клавиатурных событий. Пока отключена /// </summary> /// <param name="code">Флаг передачи управления следующему хуку</param> /// <param name="wParam"> Содержит доп. информацию о сообщении </param> /// <param name="lparam"> Содержит информацию о нажатых клавишах</param> /// <returns></returns> private int KBCallbackFunction(int code, IntPtr wParam, IntPtr lparam) { /*MSG msgstruct = (MSG) Marshal.PtrToStructure(wParam, typeof(MSG)); System.Windows.Forms.Message Message_ = new System.Windows.Forms.Message(); Message_.HWnd = msgstruct.hwnd; Message_.LParam = msgstruct.lParam;*/ /*Message_.WParam = msgstruct.wParam;*/ ActionLogger.UserAction uaKbd = new ActionLogger.UserAction(); KBDLLHOOKSTRUCT kbinfo = (KBDLLHOOKSTRUCT) Marshal.PtrToStructure(lparam,typeof(KBDLLHOOKSTRUCT)); uaKbd.ThreadId = this.ThreadId; System.Windows.Forms.Message msg = new System.Windows.Forms.Message(); msg.Msg = wParam.ToInt32(); msg.HWnd = IntPtr.Zero; msg.WParam = wParam; msg.LParam = lparam; uaKbd.EventCode = msg; uaKbd.ControlHandle = IntPtr.Zero; uaKbd.KeyCode= (int)kbinfo.vkCode; ActionHost.AddItem(uaKbd); /* BinaryFormatter bfSerializer = new BinaryFormatter(); NamedPipeServerStream pipeStream = new NamedPipeServerStream("hookpipe"); bfSerializer.Serialize(pipeStream,uaKbd); pipeStream.Close();*/ return CallNextHookEx(IntPtr.Zero, code, wParam, lparam); }