嗨,我的任务是创建一个如下所示的键盘挂钩。用户必须在任意位置按ctrl + shift + r(不必在窗体中),然后程序必须开始记录用户输入的键并将其写入文本文件(键代码),然后按ctrl + shift + r agian停止录音。当表单集中时,我可以执行此操作,但是我不知道如何为此编写键盘挂钩。我被告知要使用user32 dll,但我不知道它是如何工作的。
我已经编写了此程序,以便能够在窗体集中时工作,但我现在需要它作为键盘钩起作用,不仅是在窗体集中时。我将提供有关我尝试过的内容的代码,但是它只能开始记录,但是不会记录之后我按下的键。
KeyboardHook hook = new KeyboardHook();
public string pathName;
public bool recording = false;
int counter = 0;
public Form1()
{
InitializeComponent();
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
hook.RegisterHotKey(Opdrag_4C_ITRW316.ModifierKeys.Control | Opdrag_4C_ITRW316.ModifierKeys.Shift, Keys.R);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.Up:
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - 10);
break;
case Keys.Right:
Cursor.Position = new Point(Cursor.Position.X + 10, Cursor.Position.Y);
break;
case Keys.Down:
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 10);
break;
case Keys.Left:
Cursor.Position = new Point(Cursor.Position.X - 10, Cursor.Position.Y);
break;
default:
break;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void btnFileSelect_Click(object sender, EventArgs e)
{
OpenfileChooser();
Focus();
}
public void OpenfileChooser()
{
OpenFileDialog fdg = new OpenFileDialog();
fdg.ShowDialog();
pathName = fdg.FileName;
MessageBox.Show(pathName);
}
public void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
counter++;
if (counter % 2 == 1)
{
lblRecording.ForeColor = Color.Red;
lblRecording.Text = "Recording";
recording = true;
Focus();
}
else
{
lblRecording.ForeColor = Color.Blue;
lblRecording.Text = "Not Recording";
recording = false;
}
this.Focus();
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (recording)
{
while (String.IsNullOrEmpty(pathName))
OpenfileChooser();
using (Stream str = new FileStream(pathName, FileMode.Append, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(str))
{
if (!(e.KeyCode == Keys.Control || e.KeyCode == Keys.Shift))
{
writer.Write(e.KeyCode.ToString().ToLower());
}
else if (e.Shift && e.KeyCode != Keys.HanjaMode)
{
if (e.KeyCode != Keys.Shift)
writer.Write(e.KeyCode.ToString().ToUpper());
}
}
}
}
}
如果有人可以告诉我如何使用user32 dll(导入并使用它)或如何更改此代码,以便在您按下表格外的任何键时该代码也可以工作,并且系统仍然可以将该键写入文本文件。谢谢大家