int RememberKeyboard(int code, IntPtr wParam, IntPtr lParam) { if (code >= 0) { HookRelated.KeyboardHookStruct keyboardHookStruct = (HookRelated.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(HookRelated.KeyboardHookStruct)); Keys key = (Keys)keyboardHookStruct.vkCode; Structure.Keyboard keyboardData = new Structure.Keyboard(); byte[] ch = new byte[256]; int a = Marshal.ReadInt32(lParam); Marshal.Copy(lParam, ch, 0, 255); switch ((int)wParam) { case (int)HookRelated.KeyboardConduct.WM_SYSKEYDOWN: //只有Alt在此 if (key == Keys.LMenu || key == Keys.RMenu) { m_IsDownAlt = true; } keyboardData = new Structure.Keyboard(key, m_IsDownCtrl, m_IsDownAlt, m_IsDownShift, m_IsDownCapsLock); break; case (int)HookRelated.KeyboardConduct.WM_SYSKEYUP: //Alt+?按下,当?释放触发 break; case (int)HookRelated.KeyboardConduct.WM_KEYDOWN: if (key == Keys.LControlKey || key == Keys.RControlKey) { m_IsDownCtrl = true; } m_IsDownCapsLock = HookRelated.GetKeyState((int)HookRelated.KeyboardASCII.CapeLock) == 1 ? true : false; m_IsDownShift = HookRelated.GetKeyState((int)HookRelated.KeyboardASCII.Shift) == 1 ? true : false; byte[] keyState = new byte[256]; int n = HookRelated.GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (HookRelated.ToAscii(keyboardHookStruct.vkCode, keyboardHookStruct.scanCode, keyState, inBuffer, keyboardHookStruct.flags) == 1) { //KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); keyboardData = new Structure.Keyboard(key, m_IsDownCtrl, m_IsDownAlt, m_IsDownShift, m_IsDownCapsLock); } //else //{ // if(m_IsDownCapsLock) // keyboardData = new Structure.Keyboard(Keys.CapsLock, m_IsDownCtrl, m_IsDownAlt, m_IsDownShift, m_IsDownCapsLock); // else if(m_IsDownCtrl) // keyboardData = new Structure.Keyboard(Keys.Control, m_IsDownCtrl, m_IsDownAlt, m_IsDownShift, m_IsDownCapsLock); // else if (m_IsDownShift) // keyboardData = new Structure.Keyboard(Keys.Shift, m_IsDownCtrl, m_IsDownAlt, m_IsDownShift, m_IsDownCapsLock); //} break; case (int)HookRelated.KeyboardConduct.WM_KEYUP: if (key == Keys.LControlKey || key == Keys.RControlKey) { m_IsDownCtrl = false; } if (key == Keys.LMenu || key == Keys.RMenu) { m_IsDownAlt = false; } break; } KeyboardIputEvent(keyboardData); } return(HookRelated.CallNextHookEx(m_Code, code, wParam, lParam)); }