【问题标题】:Why isn't my app getting mouse wheel tilt messages?为什么我的应用程序没有收到鼠标滚轮倾斜消息?
【发布时间】:2010-11-08 17:09:18
【问题描述】:

在这个问题How to detect mouse wheel tilt 中发布并接受了一个答案,其中显示了所需的代码。

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

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

我已将我的 Intellipoint 驱动程序更新到 2009 年 8 月 5 日的版本 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>

更新

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

更新

SuperUser 上的This question 可能与此有关 - 我会留意那里的答案。

【问题讨论】:

  • 您是否在表单中使用了 WndProc?
  • @Daniel - 是的,我应该在问题中明确说明。
  • @skaffman - 不确定硬件标签。我 99% 确定鼠标工作正常 - 请参阅我关于其他处理倾斜的应用程序的说明。

标签: c# winforms mousewheel tilt


【解决方案1】:

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

编辑:您还可以在 WndProc 方法中调用 m.ToString() 来获取您收到的消息的 name (!)。 (这是由Syetm.Windows.Forms.MessageDecoder.MsgToString 中的一个巨大的 switch 语句完成的)

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

另外,请注意不同的鼠标会发送不同的鼠标滚轮消息。我有一个罗技鼠标,它发送0x20EWParam,左滚动为负,右滚动为正。


编辑(响应 cmets)

请记住,水平滚动是在垂直滚动之后很久才添加的,旧程序不支持。因此,鼠标驱动程序很可能正在寻找水平滚动条并显式滚动它们。尝试在您的表单中添加一个水平滚动条,将其置于负数位置,这样用户就不会看到它,并查看是否有任何改变。

【讨论】:

  • 其他消息似乎正在发送到表单 - 鼠标点击等 - 但我会检查一下。
  • 倾斜滚轮消息由鼠标驱动程序发送,而不是 Windows 本身 (AFAIK),因此它们的行为可能不同。 Spy++ 也可以搜索所有子窗口(日志记录选项)
  • MessageDecoder.MsgToString 在 .NET 3.5 中似乎不存在。
  • 内部类型;它由 Message.ToString 调用
  • 可以在Reflector或者.Net Reference Source中看到。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2021-09-13
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
相关资源
最近更新 更多