代码之家  ›  专栏  ›  技术社区  ›  ImaginaryHuman072889

C#:全局鼠标事件处理程序只触发一次

  •  0
  • ImaginaryHuman072889  · 技术社区  · 7 年前

    我使用的是最初发布的全局鼠标事件处理程序 here .

    原始问题中发布的代码运行得非常好,只是由于某种原因,当我使用它时,它只被触发了一次(之后,它再也不会被触发。)

    // Subscribe to Event, (placed this in constructor)
    MouseHook.Start();  
    MouseHook.MouseAction += new EventHandler(Event);
    
    // ...
    
    // This function only gets triggered once
    private void Event(object sender, EventArgs e)
    {
       // Do something
    }
    

    但是,通过一些实验,我确实让它工作了,所以每次鼠标点击都会触发它(不仅仅是第一次)。

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
           MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));  
           MouseAction(null,new EventArgs());
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
    

    对此:

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
           MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));  
           MouseAction(null,new EventArgs());
    
           // Added these two lines, works perfectly now
           stop();
           Start();
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
    

    有人能解释一下:

    1. 为什么我一开始就遇到这个问题
    2. 上面显示的“变通方法”有效吗?
    0 回复  |  直到 7 年前
    推荐文章