C#低级鼠标钩子和窗体事件处理

C#低级鼠标钩子和窗体事件处理,c#,setwindowshookex,mouse-hook,C#,Setwindowshookex,Mouse Hook,我正在使用VS2010生成的一个简单表单,它包含两个按钮,开始和停止。 Start使用SetWindowsHookEx触发WH_鼠标,stop停止钩子。 钩子工作得很好,我设法用双击“替换”鼠标中键单击,唯一的问题是单击表单的最小化/最大化/关闭按钮,看起来钩子和上面提到的按钮调用的事件之间存在某种“事件竞赛”。它反映了这样一个事实:当你按下其中一个按钮时,它会在完成动作之前被“按下”一段时间(例如,表单最小化)。 当我右键单击表单并选择其中一个操作时,它会立即响应,当我停止钩子并按下上面提到的

我正在使用VS2010生成的一个简单表单,它包含两个按钮,开始和停止。 Start使用SetWindowsHookEx触发WH_鼠标,stop停止钩子。 钩子工作得很好,我设法用双击“替换”鼠标中键单击,唯一的问题是单击表单的最小化/最大化/关闭按钮,看起来钩子和上面提到的按钮调用的事件之间存在某种“事件竞赛”。它反映了这样一个事实:当你按下其中一个按钮时,它会在完成动作之前被“按下”一段时间(例如,表单最小化)。 当我右键单击表单并选择其中一个操作时,它会立即响应,当我停止钩子并按下上面提到的按钮时,会发生同样的事情。
有人遇到过这种行为吗?

我以前也有过这种经历。我不确定确切的原因,但我总是通过监听鼠标进入和离开窗体、窗口的客户端区域时触发的事件来解决问题。您可以使用这些事件来钩住和解开鼠标,然后您将获得正常的行为。

我的第一反应是,您可能使用了错误的工具来执行此任务-我想不出有多少情况下您需要使用Windows钩子。也许你可以回到导致你实现这个解决方案的问题上来,并发布一个关于这个问题的问题?嗨,据我所知,在接近这个方法之前,我做了很多研究,如果我想让我的普通鼠标在点击鼠标中键时产生双击,那就是“拦截”点击鼠标中键并模拟两次鼠标左键点击相同的x,y方向,如果我想让它在我的应用程序运行时也能正常工作。不在焦点或最小化(或在系统托盘上)挂钩是唯一的方法。不管怎样,我更像是c/c++程序员,我只想使用c,因为创建GUI的简单性。@Alex-你的研究得出了错误的结论。只需捕获鼠标中键并执行与双击鼠标事件相同的事件(实际上只是一个单击事件)。此外,并不是所有的鼠标都有鼠标中键,所以要注意这一点。如何准确地在C#中全局捕获鼠标中键状态(即使你的应用程序未处于焦点)?关于双击,这正是我所做的,发送两次模拟点击到鼠标x,y。我担心我的问题的原因是run.application启动表单,表单启动钩子,因此当我单击表单的一个按钮时,消息泵需要泵送钩子接收到的所有消息以及钩子没有发送的所有消息,然后才能将事件发送到表单(例如close form event)我很想看看你的回调方法。太多而无法发布?