为什么我的应用程序没有获得鼠标滚轮倾斜消息?

时间:2009-07-07 13:57:41

标签: c# winforms mousewheel tilt

在此问题How to detect mouse wheel tilt中,会发布并接受显示所需代码的答案。

我已经在我的应用程序的现有WndProc方法中实现了该代码(该方法适用于我需要捕获的其他消息),但它无效。我已经检查过了,当我倾斜鼠标滚轮时,WndProc似乎没有收到任何价值为0x020E的消息。

我在安装了.NET 3.5 SP1的Windows XP SP3(完全修补)上使用Microsoft Wireless Laser 5000。

我已将我的Intellipoint驱动程序更新为日期为08/05/2009的版本7.0.258.0。

其他应用程序(例如Visual Studio,Word,paint.NET)正在使鼠标滚轮倾斜,因此它必须是我的应用程序,但我看不出我做错了什么。

为了完整起见,这是我的代码:

    protected override void WndProc(ref Message m)
    {
        Trace.WriteLine(string.Format("0x{0:X4}", m.Msg));
        switch(m.Msg)
        {
            case WM_EXITSIZEMOVE:
                Opacity = 1.0;
                break;
            case WM_SYSCOMMAND:
                int command = m.WParam.ToInt32() & 0xfff0;
                if (command == SC_MINIMIZE && this.minimizeToTray)
                {
                    MinimizeToTray();
                }
                break;
            case WM_MOUSEHWHEEL:
                // Handle tilting here
                break;
        }
        base.WndProc(ref m);
    }

Trace.WriteLine来电是尝试检查倾斜消息是否正常通过。正在接收其他消息WM_EXITSIZEMOVEWM_SYSCOMMAND。消息定义为:

    private const int WM_EXITSIZEMOVE = 0x0232;
    private const int WM_SYSCOMMAND = 0x0112;
    private const int SC_MINIMIZE = 0xF020;
    private const int WM_MOUSEHWHEEL = 0x020E;

注意 我删除了[hardware]标记,因为我99%确定它不是因为其他应用程序正在接收消息而导致的硬件错误。

更新

我添加了一个带有滚动条的多行文本框到我的应用程序,它接收并处理鼠标滚轮倾斜消息。所以我需要做的就是找到代码;)

更新

超级用户的{p> This question可能会对此有所影响 - 我会密切关注那里的答案。

1 个答案:

答案 0 :(得分:1)

使用Spy ++检查您收到的消息。

编辑:你也可以在你的WndProc方法中调用m.ToString()来获取你收到的消息的名称(!)。 (这是通过Syetm.Windows.Forms.MessageDecoder.MsgToString

中的巨型switch语句完成的

请注意,消息可能只发送给任何具有焦点的控件而不是表单本身;如果是这种情况,您可能想要使用message filter

另外,请注意不同的鼠标会发送不同的鼠标轮信息。我有一台Logitech鼠标,发送0x20E WParam,左滚动为负,右滚动为正。


编辑(回复评论)

请记住,纵向滚动后很久就会添加水平滚动,旧程序不支持。因此,鼠标驱动程序很可能正在寻找水平滚动条并明确滚动它们。尝试在表单中添加一个水平滚动条,使其处于负面位置,以便用户看不到它,并查看是否有任何改变。