在此问题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_EXITSIZEMOVE
和WM_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可能会对此有所影响 - 我会密切关注那里的答案。答案 0 :(得分:1)
使用Spy ++检查您收到的消息。
编辑:你也可以在你的WndProc方法中调用m.ToString()来获取你收到的消息的名称(!)。 (这是通过Syetm.Windows.Forms.MessageDecoder.MsgToString
)
请注意,消息可能只发送给任何具有焦点的控件而不是表单本身;如果是这种情况,您可能想要使用message filter。
另外,请注意不同的鼠标会发送不同的鼠标轮信息。我有一台Logitech鼠标,发送0x20E
WParam
,左滚动为负,右滚动为正。
编辑(回复评论)
请记住,纵向滚动后很久就会添加水平滚动,旧程序不支持。因此,鼠标驱动程序很可能正在寻找水平滚动条并明确滚动它们。尝试在表单中添加一个水平滚动条,使其处于负面位置,以便用户看不到它,并查看是否有任何改变。