非激活窗口中响应鼠标滚动之理论篇

在最近工作中有一个优化交互的需求,分析后得知,其核心功能为能在非激活窗口中响应鼠标滚动消息,先就该需求进行前期方案验证。

同类产品实现

参照现有软件行为,操作系统为Win7。以notepad++Chrome两款软件为例。

  • 当鼠标选中notepad++后,然后将鼠标转移到Chrome界面后,上下滚动鼠标,Chrome页面能够同步滚动。
  • 当鼠标选中Chrome后,然后将鼠标转移到Notepad++界面,上下滚动,Notepad++不能同步滚动。

猜测是Chrome对滚轮滚动消息进行了额外处理。既然现有软件支持该功能,那么在技术上就不是问题。接下来就是确定方案。在经过一番
搜索后,发现该需求的核心关键词是 scroll, inactive, hover

关联问题链接

  1. How to direct the mouse wheel input to control under cursor instead of focused?
  2. Windows上的焦点系统
  3. Mouse Wheel Scrolling not always working in Windows 10
  4. 微软鼠标指针交互文档
  5. On Windows 7, is there any way to make the scrollwheel‘s focus follow the mouse?

在Win10之前的版本,鼠标滚动会影响当前激活的窗口,而不影响鼠标当前悬停窗口。而Win10系统改变这种默认行为,当鼠标滚动时,会影响鼠标当前悬停窗口,而不是当前激活的窗口。该功能已经在Win10上得到验证,可通过以下来进行设置。

鼠标滚轮处理流程

在Windows系统上,焦点决定了由哪个窗口或者控件接收键盘输入信息,对于用户来说,最直观的感觉是,有光标闪动的窗口或者被高亮的控件,就有焦点。更进一步,这里的焦点仅仅控制键盘输入,鼠标输入与焦点没有直接关系。系统的焦点模型决定了鼠标是如何使得一个窗口获得焦点的,主要有以下三种模型:

  1. click-to-focus模型
    鼠标点击的窗口可以获得焦点。这是Windows下最常见的一种模型,当用户点击鼠标时,鼠标当前位置下的窗口会被激活,并被置于所有窗口的最前面,可接受键盘输入。
  2. focus-follow-mouse模型

    鼠标当前位置下的窗口可以获取焦点。当鼠标移动到一个可以获得焦点的窗口范围内,用户无需点击窗口,即可激活该窗口,使得可以接收键盘输入。此时,该窗口不一定会置于最前方。当鼠标移出该窗口范围时,该窗口随之失去焦点。

  3. sloppy-focus模型
    该模式与focus-follow-mouse模型类似,不同之处在于,当鼠标移出该窗口范围时,该窗口不会失去焦点,直到鼠标移动到另外一个可以接收焦点的窗口时,输入焦点才会改变。

鼠标滚动消息是 WM_MOUSEWHEEL,官方解释如下:

Sent to the active window when the mouse's horizontal scroll wheel is tilted or rotated.
The DefWindowProc function propagates the message to the window's parent.
There should be no internal forwarding of the message, since DefWindowProc propagates it up the parent chain until it finds a window that processes it.

A window receives this message through its WindowProc function.

默认情况下,鼠标滚轮消息会发往当前有焦点的窗口,默认的窗口处理过程会将该消息往上传递,直到该消息被处理为止。

可行的解决方案

由于在Win10系统下,默认鼠标滚轮对非激活窗口是生效的,但为了兼容性考虑,程序自身还是要额外处理。下面列出以下两类方案:

  • 方案一
    使用第三方软件,不搜不知道,一搜才知道有这么多的小软件可以满足该需求。

  • 方案二
    自己搭轮子,利用鼠标钩子,将滚轮滚动消息传递给鼠标当前位置所在窗口即可。

原文地址:https://www.cnblogs.com/cherishui/p/12056299.html

时间: 2024-10-31 08:49:31

非激活窗口中响应鼠标滚动之理论篇的相关文章

OpenCV中响应鼠标消息 (转)

1 #include <cv.h> 2 #include <highgui.h> 3 #include <stdio.h> 4 5 #pragma comment(lib,"C:\\Program Files\\OpenCV1.0\\lib\\cv.lib") 6 #pragma comment(lib,"C:\\Program Files\\OpenCV1.0\\lib\\cxcore.lib") 7 #pragma comme

OpenCV中响应鼠标信息

转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h>#include <highgui.h>#include <stdio.h> void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** argv){     CvCapture *capture; 

OpenCV中响应鼠标信息cvSetMouseCallback函数的使用

转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h> #include <highgui.h> #include <stdio.h void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** argv) { CvCapture *capture; IplIm

Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]

方法千千万,我只是其中一笔[通过控制PictureBox来控制图片,图片完全施展在控件中]...几久不做,还真有点陌生! 窗体构造中添加鼠标滚动: 1 /// <summary> 2 /// 窗体构造方法 3 /// </summary> 4 public CandidateForm() 5 { 6 InitializeComponent(); 7 this.MouseWheel += new MouseEventHandler(CandidateForm_MouseWheel);

用鼠标在窗口中画方形

//用鼠标在窗口中画方形 //作者:sandy //时间:2015-10-7 //user can draw boxes on the screen #include <cv.h> #include <highgui.h> using namespace std; CvRect box; bool drawing_box=false; //定义一个回调函数 //define our callback which we will install for mouse event //

在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法

在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法[MXDRAW CAD控件文档]下面帮助的完整例子,在控件安装目录的Sample\Ie\iedemo.htm中. 主要用到函数说明A. ImplementCommandEventFun控件的命令事件函数,与用户交互的操作,需要放到命令事件函数内实现,这样控件才能保证正常的Windows 消息循环被处理.B. ImplementMouseEventFun控件的鼠标事件函数,可以用JS程序里,响应鼠标事件,详细说明如下:void MouseE

jQ禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突

1. 禁止右键点击 代码如下: $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 代码如下: $(document).ready(function() { $("input.text1").val("Enter your search text here"); textFill($

selenium怎么滚动到窗口中的指定元素的位置

1.一个窗口中有些元素并不能在展示的页面中看到,需要滚动条滚动后才能显示出来, 这样selenium是不能直接定位到该元素的. 两种解决方法: 一:使用js执行 JavascriptExecutor js; Actions actions; js =(JavascriptExecutor) driver; js.executeScript("arguments[0].scrollIntoView();", coursePage.getViewDetails().get(0)); 这种方

实现窗口中的文档自动向上滚动,方便阅读

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta ht