【问题标题】:c# fix global hotkeyc# 修复全局热键
【发布时间】:2017-12-20 05:46:26
【问题描述】:

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

热键类代码: 类热键 {

    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 )。为什么会发生这种情况?当代码只是关于热键的时候,它在第一次工作得很好。提前感谢您的帮助!

【问题讨论】:

  • 它是否工作了一段时间,然后在运行应用程序后停止工作?过去我遇到过问题,您丢失了对触发按键事件的处理程序的引用?这是一个很长的镜头,但在保持对处理程序的引用处于活动状态方面可能是一个类似的问题吗?
  • 暂时不起作用。当我运行它然后按注册的键没有任何反应。
  • @Joe_DM 嘿,伙计们,我刚刚尝试创建一个新的 WinForm 并为全局热键编写代码,它就成功了!您认为我该如何解决?
  • 没人帮我多伤心。
  • 这只是一个小时,因为你说它正在一个新的应用程序中工作,所以没有太多信息可以发布。如果上面的代码正常工作,那么它一定是别的东西?

标签: c# global-hotkey


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2014-09-22
    相关资源
    最近更新 更多