C# 单击“帮助”按钮时,Windows将杀死SetWindowsHookEx

C# 单击“帮助”按钮时,Windows将杀死SetWindowsHookEx,c#,setwindowshookex,C#,Setwindowshookex,我有一个奇怪的问题。我正在为正在开发的c应用程序创建两个钩子,一个用于键盘,一个用于鼠标,使用以下代码: //keyboard SetWindowsHookEx(13, keyBoardDelegate, IntPtr.Zero, 0); //mouse SetWindowsHookEx(14, mouseDelegate, IntPtr.Zero, 0); 除了第一个参数和委托之外,鼠标和键盘钩子过程代码看起来都相同 当用户使用鼠标或键盘时,我会收到通知。问题出现在我使用代码激活主窗口顶部的

我有一个奇怪的问题。我正在为正在开发的c应用程序创建两个钩子,一个用于键盘,一个用于鼠标,使用以下代码:

//keyboard
SetWindowsHookEx(13, keyBoardDelegate, IntPtr.Zero, 0);
//mouse
SetWindowsHookEx(14, mouseDelegate, IntPtr.Zero, 0);
除了第一个参数和委托之外,鼠标和键盘钩子过程代码看起来都相同

当用户使用鼠标或键盘时,我会收到通知。问题出现在我使用代码激活主窗口顶部的“小问题帮助”按钮之后

 this.HelpButton = true;
 this.HelpButtonClicked += new System.ComponentModel.CancelEventHandler(this.AutoStandBy_HelpButtonClicked);
每次我单击窗口顶部的“帮助”按钮时,我的表单都会冻结一段时间,然后它会响应并执行AutoStandBy\u HelpButtonClicked函数中的代码。为了停止冻结应用程序,我必须删除鼠标SetWindowsHookEx功能,但不能删除键盘的SetWindowsHookEx。在过去的几天里,我一直在努力解决这个问题,但运气不佳。有人知道如何解决这个问题吗

 private IntPtr MouseHookDelegate(Int32 Code, IntPtr wParam, IntPtr lParam)
        {
            /// Call CallNextHookEx so we do not break the hook
            if (Code < 0)
                return CallNextHookEx(mouseHandle, Code, wParam, lParam);

            /// if a mouse change occured then call the mouse event
            if (MouseMoved != null)
                MouseMoved(this, new EventArgs());

            /// Call CallNextHookEx so we do not break the hook
            return CallNextHookEx(mouseHandle, Code, wParam, lParam);
        }

冻结一段时间是导致钩子被破坏的原因,Windows确保中断的回调不会使机器无法使用。您发布错误代码的几率很低,很快就能解决此问题。您的mouseDelegate目标方法有问题,我们看不到。你有5秒钟的时间用键盘点击Debug+Break All,看看它卡在哪里。没有键盘钩子的地方当然:你好,我更新了代码。也许这对你有点帮助。只是一个问题。此代码与键盘代理的代码相同。请使用秒表测量调用MouseMoved所需的时间。我不在办公室,所以我一回来就会尝试。我应该期待找到什么?你认为我的MouseHookDelegate功能有问题吗?代理看起来不错。事件处理程序MouseMoved花费的时间太长。
  mi = new MouseInput();
  ///register the mouse event to check for movement
  mi.MouseMoved += mouse_MouseMoved;