【问题标题】:Can I suppress selected input before the application's main loop?我可以在应用程序的主循环之前抑制选定的输入吗?
【发布时间】:2009-08-12 04:32:42
【问题描述】:

作为我的 Visual Studio 实用程序插件 SamTools 的一部分,我有一个鼠标输入例程,它可以捕获 Ctrl+MouseWheel 并向活动文本窗口发送一个向上/向下翻页命令。 Visual Studio 2010 添加了一个新的“功能”,使用该手势进行放大/缩小(barf)。目前,我的加载项确实发送了滚动命令,但 Visual Studio 仍会更改字体大小,因为我没有吃掉输入。

我通过调用SetWindowsHookEx 设置了我的钩子。这是回调代码。 我的问题是: 是防止 Visual Studio 将 Ctrl+MouseWheel 输入作为缩放命令处理的最佳方式按下 Ctrl 键的事件?

(请记住,这是我的一些代码。):)

private IntPtr MouseCallback(int code, UIntPtr wParam, ref MOUSEHOOKSTRUCTEX lParam)
{
    try
    {
        // the callback runs twice for each action - this is the latch
        if (enterHook)
        {
            enterHook = false;
            if (code >= 0)
            {
                int x = lParam.mstruct.pt.X;
                int y = lParam.mstruct.pt.Y;

                uint action = wParam.ToUInt32();
                switch (action)
                {
                case WM_MOUSEWHEEL:
                    OnMouseWheel(new MouseEventArgs(MouseButtons.None, 0, x, y, ((short)HIWORD(lParam.mouseData)) / (int)WHEEL_DELTA));
                    break;

                default:
                    // don't do anything special
                    break;
                }
            }
        }
        else
        {
            enterHook = true;
        }
    }
    catch
    {
        // can't let an exception get through or VS will crash
    }

    return CallNextHookEx(mouseHandle, code, wParam, ref lParam);
}

下面是响应MouseWheel 事件而执行的代码:

void mouse_enhancer_MouseWheel( object sender, System.Windows.Forms.MouseEventArgs e )
{
    try
    {
        if ( Keyboard.GetKeyState( System.Windows.Forms.Keys.ControlKey ).IsDown && Connect.ApplicationObject.ActiveWindow.Type == vsWindowType.vsWindowTypeDocument )
        {
            int clicks = e.Delta;
            if (e.Delta < 0)
            {
                Connect.ApplicationObject.ExecuteCommand( "Edit.ScrollPageDown", "" );
            }
            else
            {
                Connect.ApplicationObject.ExecuteCommand( "Edit.ScrollPageUp", "" );
            }
        }
    }
    catch ( System.Runtime.InteropServices.COMException )
    {
        // this occurs if ctrl+wheel is activated on a drop-down list. just ignore it.
    }
}

PS:SamTools 是开源 (GPL) - 您可以从链接下载它,源代码在安装程序中。

PSS:Ctrl+[+] 和 Ctrl+[-] 更适合缩放。让 Ctrl+MouseWheel 滚动(更常用的命令)。

【问题讨论】:

    标签: visual-studio-2010 visual-studio-addins mousewheel mouse-hook


    【解决方案1】:

    根据MSDN,您处理的鼠标消息可以扔掉。建议如下:

    如果 nCode 小于零,则钩子 过程必须返回值 由 CallNextHookEx 返回。

    如果 nCode 大于等于 零,并且钩子程序没有 处理消息,它是高度 建议您致电 CallNextHookEx 并返回它的值 返回;否则,其他应用程序 已安装 WH_MOUSE 挂钩 不会收到挂钩通知 并且可能行为不正确 结果。如果钩子程序 处理了消息,它可能会返回一个 非零值以防止系统 从将消息传递到目标 窗口过程。

    换句话说,如果您的鼠标回调最终使用鼠标消息,您不必调用下一个CallNextHookEx - 只需返回一个非零值并且(至少理论上)鼠标移动应该得到吞下。如果这不起作用,请发表评论,我们可以进行迭代。

    顺便说一句,另一种可能的选择:VS 到鼠标滚轮的映射可能会显示在工具...自定义... UI 中,就像键映射一样。在这种情况下,您可以简单地重新映射加载项的命令,而不是在挂钩级别工作。但也有可能(可能?)这个手势是硬编码的。

    【讨论】:

    • 不幸的是,自定义选项中没有显示鼠标命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多