我正在为一项研究记录用户操作(参与研究的人都知道他们的操作已被记录),因此我一直在用 C# 构建一个小键盘记录器。
感谢 msdn doc 和一些教程,我可以使用 KeyPressEvent 很好地工作,但现在我意识到 5 天前我在使用 ctrl、alt 修饰符时遇到了问题。我发现我必须使用 KeyDown 和 KeyUp 事件来记录这些论文。
这是我的 Windows 窗体代码和位于 Hook.cs 类中的 KeyProc 函数:
private IntPtr KeyProc(int nCode, int wParam, IntPtr lParam)
{
bool handled = false;
//On verifie si tous est ok
if ((nCode >= 0) && (m_onKeyDown != null || m_onKeyUp != null || m_onKeyPress != null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
//KeyDown
if (m_onKeyDown != null && (wParam == 0x100 || wParam == 0x104))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
m_onKeyDown(this, e);
handled = handled || e.Handled;
}
// KeyPress
if (m_onKeyPress != null && wParam == 0x100)
{
bool isShift = ((GetKeyState(0x10) & 0x80) == 0x80 ? true : false);
bool isCapslock = (GetKeyState(0x14) != 0 ? true : false);
//bool isCtrl = (GetKeyState(0x11) != 0 ? true : false);
//bool isAlt = (GetKeyState(0x12) != 0 ? true : false);
byte[] keyState = new byte[256];
GetKeyboardState(keyState);
byte[] inBuffer = new byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct.flags) == 1)
{
char key = (char)inBuffer[0];
if ((isCapslock ^ isShift) && Char.IsLetter(key))
key = Char.ToUpper(key);
KeyPressEventArgs e = new KeyPressEventArgs(key);
m_onKeyPress(this, e);
handled = handled || e.Handled;
}
}
// KeyUp
if (m_onKeyUp != null && (wParam == 0x101 || wParam == 0x105))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
m_onKeyUp(this, e);
handled = handled || e.Handled;
}
}
private void OnKeyUp(object sender, KeyEventArgs e)
{
if (e.Control)
flagD = false;
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
textBox1.Text += e.KeyCode;
flagD = e.Control ? true : false;
textBox1.Text += " " + flagD;
}
我不明白为什么 e.Control 总是错误的,我一直在文本框中显示 e.KeyCode;我可以看到 ControlKey 被记录了,但我不明白为什么 flagD 总是假的。