C#在Win10与非Win10 Windows系统鼠标滚动编程的一点区别。
C#在win10和非Win10上处理鼠标滚动有一些区别,建一个Form1,放置一个FlowLayoutPanel ,类型的Panel1
Panel.MouseWheel += PanelOnMouseWheel; private void PanelOnMouseWheel(object sender, MouseEventArgs mouseEventArgs)
{
if (mouseEventArgs.Delta < )
ScrollBar.Value = ScrollBar.Value == ScrollBar.Maximum ? ScrollBar.Maximum : ++ScrollBar.Value;
else
ScrollBar.Value = ScrollBar.Value == ScrollBar.Minimum ? ScrollBar.Minimum : --ScrollBar.Value; }
以上代码在win10上,只要鼠标在Panel1客户区范围内,那么滚动鼠标滚轮时,就能触发滚动事件,但是在非win10上,如果焦点不在Panel上,比如在Form1窗体一个Button上,那么就不能触发滚动事件。
解决办法
[DllImport("user32.dll")]
public static extern IntPtr GetFocus();
需要判断焦点按钮是否是本窗口子控件,使用IMessageFilter。
const int WM_MOUSEWHEEL = 0x020A;
[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(int xPoint, int yPoint);
public bool PreFilterMessage(ref Message msg)
{
if (msg.Msg == WM_MOUSEWHEEL)
{
IntPtr hWnd = WindowFromPoint(MousePosition.X, MousePosition.Y);
if ((CheckControl(this, hWnd)))
{
int wpara = (int)msg.WParam;
//this.Parent.Parent.Text = "wparam:" + wpara.ToString() + ", msg:" + msg.Msg + ",hwnd:" + msg.HWnd.ToString();
// MessageBox.Show("123");
if ((wpara & 0x80000000) == 0x80000000)//向下
ScrollBar.Value = ScrollBar.Value == ScrollBar.Maximum ? ScrollBar.Maximum : ++ScrollBar.Value;
else
ScrollBar.Value = ScrollBar.Value == ScrollBar.Minimum ? ScrollBar.Minimum : --ScrollBar.Value; }
return false;
}
return false;
}
public bool CheckControl(Control control, IntPtr handle)
{
if (control == null)
return false;
try
{
for (int i = ; i < control.Controls.Count; i++)
{
var v = control.Controls[i];
if (handle == v.Handle)
{
return true;
}
else
{
if (v.Controls.Count > )
{
if (CheckControl(v, handle))
{
return true;
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
return false;
}
如果有更好的解决办法请指点。
为了提示查找效率,可以使用下面函数
public static bool CheckIsParentControl(Control parentControl, Control childControl)
{
if(childControl==null)return false;
if (childControl.Parent == null)
{
return false; }
if (childControl.Parent == parentControl)
{
return true; }
return CheckIsParentControl(parentControl, childControl.Parent); }
C#在Win10与非Win10 Windows系统鼠标滚动编程的一点区别。的更多相关文章
- [常识]Windows系统里休眠和睡眠的区别?
睡眠和休眠都是笔记本电脑的节能方式,但有细微的差别: 睡眠还保持着开机状态的,休眠是关机了,但是再次开机之后和关闭时的系统状态是一样的. 睡眠还是保持着系统运行数据在内存中,而休眠则将内存中的数据保存 ...
- [Windows]为windows系统鼠标右键添加软件和图标
转载自 https://blog.csdn.net/p312011150/article/details/81207059 一.打开注册表 首先打开windows的注册表,当然了,我个人倾向于 (1) ...
- 更改Windows系统时间同步频率【windows 7,windows 8,win10】
Windows系统默认的时间同步间隔是7天,如果我们需要修改同步的时间间隔(同步频率),我们可以通过修改注册表来手动修改它的自动同步间隔以提高同步次数,保证时钟的精度,windows7,Windows ...
- 从零开始安装搭建win10与ubuntu20.04双系统开发环境——集安装、配置、软件、美化、常见问题等于一体的——超详细教程
目录 **前言 ** 关于系统安装配置与软件安装 一.Win10安装ubuntu20.04双系统 1.按照自己的需求分区 2.配置软件镜像源 软件包管理工具介绍 更换APT源--使用国内镜像 3.解决 ...
- 怎样在Win10下安装ubuntu双系统
Win10系统下安装ubuntu系统 安装前准备: 概念 在动手之前,一定要先了解双系统.系统引导.分区这3个概念,这样才能理解安装步骤,应对安装过程中的意外情况. 双系统 双系统就是开机之后,会有一 ...
- UEFI+GPT安装WIN7,WIN8/WIN10下安装WIN7双系统
一.BIOS更改 首先来bios更改:我们知道,uefi+gpt引导虽然出来的时间比较长,但是win7还不能完全的支持,所以在使用uefi+gpt安装win7的时候就会出现各种错误!所以我们在安装Wi ...
- win10安装ubuntu16.04双系统
前话:因为感兴趣吧也是专业需要,所以自学了U盘重装系统以及在win10的情况下安装Ubuntu16.04双系统.借此博客,记录下我安装Ubuntu的过程,方便日后回忆. 正因如此,本篇博客会写的十分简 ...
- win10和ubuntu16.04双系统时间同步
在win10安装了ubuntu双系统,发现在两个系统见时间相差8个小时,这是由于windows和和ubuntu对于从主板取得时间后的处理方式不同,如果你把位置设为上海,ubuntu总是把主板时间当作u ...
- win10开启 linux Bash命令(win10内置了linux系统支持)
win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...
随机推荐
- [转帖] securebootthemes 挖矿病毒的说明 http://blog.netlab.360.com/msraminer-qian-fu-yi-jiu-de-wa-kuang-jiang-shi-wang-luo/ 原文为毛不给一个专杀工具呢.
MsraMiner: 潜伏已久的挖矿僵尸网络 2017 年 11 月底,我们的 DNSMon 系统监测到几个疑似 DGA 产生的恶意域名活动有异常.经过我们深入分析,确认这背后是一个从 2017 年 ...
- 简单对比一下不同Windows操作系统在相同硬件配置的情况下浏览器js引擎的性能
最近部门进行Windows客户端的测试产品单点性能, 感觉不在通的windows版本以及浏览器内核的情况下性能可能有差异, 也一直没有找到一个比较好的对比工具, 今天用chrome的控制台简单测试了下 ...
- Window安装Redis并设置为开机启动
一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...
- Jquery ajax $getScript()和$getJSON和JSONP
- Python装饰器的深入理解
装饰器 #装饰器:本质上是函数,(装饰其他函数)就是为其他函数添加附加功能 #原则: 1.不能修改被装饰的函数的源代码 # 2.不能修改被装饰的函数的调用方式 #实现装饰器知识储备 #1.函数即变量 ...
- Delphi中的构造函数的override的问题
TObject的构造方法Create不能被override.因为它是一个静态方法.
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
- Mvc 前台 匿名对象
View无法使用 dynamic 报错: object 未包含....的属性 这里需要区别一下:如果dynamic只是简单模型,那么还是可以使用的.例如 dynamic v = new Expando ...
- Zabbix3.0学习笔记
第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也 ...
- Leapin' Lizards HDU - 2732 (恶心的建图。。)
这道题其实不难...就是建图恶心了点....emm... 题意: 多源多汇 + 拆边 青蛙跳柱子, 每根柱子都有一定的承载能力, 青蛙跳上去之后柱子的承载能力就会减一,跳到边界就能活 跳不到就over ...