0

我创建了一个全局热键,首先它工作得很好。但是当我开始在表单中添加一些设计和额外的代码时,它就不再起作用了。然后我回到基础,只是注释掉添加到原始代码中的代码,但仍然没有运气。继承人的代码:

热键类代码:类热键{

    public enum fsModifers
    {
        Alt = 0x0001,
        Control = 0x0002,
        Shift = 0x0004,
        Window = 0x0008,
    }

    IntPtr hWnds;

    public HotKeys(IntPtr hWnd)
    {
        this.hWnds = hWnd;
    }

    public void RegisterHotKeys()
    {
        RegisterHotKey(hWnds, 1, (uint)fsModifers.Control, (uint)Keys.T);
        RegisterHotKey(hWnds, 2, (uint)fsModifers.Control, (uint)Keys.R);
    }

    public void UnregisterHotKeys()
    {
        UnregisterHotKey(hWnds, 1);
        UnregisterHotKey(hWnds, 2);
    }

    #region WindowsAPI
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    #endregion
}

主窗体代码:(下面的代码只是热键相关的代码)

private void Form1_Load(object sender, EventArgs e)
    {
        thisWindow = FindWindow(null, "Form1");
        _hotKeys = new HotKeys(thisWindow);
        _hotKeys.RegisterHotKeys();
    }

  private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        _hotKeys.UnregisterHotKeys();
    }

 protected override void WndProc(ref Message keyPressed)
    {
        if (keyPressed.Msg == 0x0312)
        {
            MessageBox.Show("my msg");
            //keyPress = keyPressed.WParam;
            //if (keyPress == (IntPtr)1)
            //{
            //    if (!autoSkillIsOn)
            //    {
            //        timer1.Start();
            //        autoSkillIsOn = true;
            //    }

            //    else if (autoSkillIsOn)
            //    {
            //        timer1.Stop();
            //        autoSkillIsOn = false;
            //    }
            //}

            //else if (keyPress == (IntPtr)2)
            //{
            //    MessageBox.Show("pressed ctrl R");
            //}
        }

        base.WndProc(ref keyPressed);
    }

正如您在 WndProc 中看到的那样,我注释掉了我想要发生的事情,只是简单地编写了一个简单的消息框,但猜猜看,当我按下任何注册的热键(Ctrl+T、Ctrl+R)时,没有出现消息框。为什么会发生这种情况?当代码只是关于热键的时候,它在第一次工作得很好。提前感谢您的帮助!

4

1 回答 1

1

我会发布一个答案,因为它似乎已经在评论中的故障排除过程中得到解决。

OpFindWindow(null, "Form1")用于获取对句柄的引用,但这可能是在定位不正确的句柄。(也许From1的内存中有多个实例?)

通过更改为 use this.Handle,可以保证 op 将热键注册到他正在调用的实例的正确句柄。

于 2017-07-15T06:18:39.810 回答