我希望将DLL user32用于创建键盘挂钩程序

时间:2019-05-16 14:45:26

标签: c# dll hook

嗨,我的任务是创建一个如下所示的键盘挂钩。用户必须在任意位置按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(导入并使用它)或如何更改此代码,以便在您按下表格外的任何键时该代码也可以工作,并且系统仍然可以将该键写入文本文件。谢谢大家

0 个答案:

没有答案