/// <summary> /// 获取键盘组合后的结果 /// </summary> /// <returns></returns> public IList <HookKeyEventArgs> GetKeyCombineResult() { var resultList = new List <HookKeyEventArgs>(); if (KeyHisDataList.Count == 0) { return(resultList); } var firstHookFile = KeyHisDataList.First();//第一行记录 var firstData = CustomEventLogger.GetHookKeyEventArgses(firstHookFile.FileName); //第一行,直接加入集合 foreach (var hookKeyEventArgse in firstData) { resultList.Add(hookKeyEventArgse); } foreach (var hookFile in KeyHisDataList) { var tmpData = CustomEventLogger.GetHookKeyEventArgses(hookFile.FileName); //当前行历史记录 if (hookFile != firstHookFile) { //重新根据diffTime组合 var tmp_Previous = tmpData.First(); foreach (var hookKeyEventArgs in tmpData) { var copyEvent = HookKeyEventArgs.Copy(hookKeyEventArgs); //拷贝新对象,用于新集合 var diffTimeSpan = copyEvent.EventTimeStamp - tmp_Previous.EventTimeStamp; //得出每次记录的间隔 if (tmp_Previous == tmpData.First()) { diffTimeSpan = TimeSpan.FromMilliseconds(hookFile.OpDiffTime); //新行的首次记录附加到前一个结果后面 } copyEvent.EventTimeStamp = resultList.Last().EventTimeStamp.Add(diffTimeSpan); //重新设定新的时间戳 //--加入集合-- resultList.Add(copyEvent); //-设置值- tmp_Previous = hookKeyEventArgs; } } } return(resultList); }
/// <summary> /// 记录键盘 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void keyboardHook_KeyLog(object sender, HookKeyEventArgs e) { KeyHisDataList.Add(e); CustomEventLogger.LogKeyEvent(e); }
/// <summary> /// キーボードフックのプロシージャ /// </summary> /// <param name="Code"></param> /// <param name="W"></param> /// <param name="L"></param> /// <returns></returns> public int KeyboardHookProc(int Code, IntPtr W, IntPtr L) { if (Code < 0) { //Codeが0より小さい場合、次のフックを呼び出す return(CallNextHookEx(HookId, Code, W, L)); } //キー入力を取得 KeyEvents procEvent = (KeyEvents)W; var kbStruct = Marshal.PtrToStructure <KBDLLHookStruct>(L); //入力文字の取得 var inputCode = (KeyboardUtilConstants.VirtualKeyCode)kbStruct.vkCode; HookKeyEventArgs e = new HookKeyEventArgs(procEvent, kbStruct, inputCode); if (inputCode == KeyboardUtilConstants.VirtualKeyCode.CapsLock || inputCode == KeyboardUtilConstants.VirtualKeyCode.HiraganaKatakana) { //CapsLock・ひらがなかたかなは処理しない } else { switch (procEvent) { case KeyEvents.KeyDown: if (inputCode == KeyboardUtilConstants.VirtualKeyCode.Shift || inputCode == KeyboardUtilConstants.VirtualKeyCode.LeftShift || inputCode == KeyboardUtilConstants.VirtualKeyCode.RightShift ) { //シフトキーダウンイベントを発生 KeyHookShiftKeyDown(this, e); } else { //一般キーダウンイベントを発生 KeyHookKeyDown(this, e); } break; case KeyEvents.SKeyDown: //Altキーダウンイベント発生 KeyHookAltKeyDown(this, e); break; case KeyEvents.KeyUp: if (inputCode == KeyboardUtilConstants.VirtualKeyCode.Shift || inputCode == KeyboardUtilConstants.VirtualKeyCode.LeftShift || inputCode == KeyboardUtilConstants.VirtualKeyCode.RightShift ) { //シフトキーダウンイベントを発生 KeyHookShiftKeyUp(this, e); } else { //一般キーアップイベントを発生 KeyHookKeyUp(this, e); } break; case KeyEvents.SKeyUp: KeyHookAltKeyUp(this, e); break; } } //フック処理の終了 return(CallNextHookEx(HookId, Code, W, L)); }