让VB开发环境支持鼠标滚轮

原创 2004年04月22日 14:41:00

        Visual Basic 6.0的集成开发环境中的代码编辑器不支持鼠标滚轮的操作,这给使用VB的人带来了很多不便,为了使它能支持鼠标滚轮操作,我制作了一个小程序帮它实现该功能。

       这个程序实现的原理是,使用全局钩子截获窗口消息,通过相应滚轮消息,向VB编辑窗口发送视图滚动消息实现VB编辑窗口对鼠标滚轮的响应。

       首先,建立一个MFC的Dll工程,向工程中添加下列函数:

       下面这个函数用于安装钩子,之所以将其声明为这种形式,主要是考虑到其可扩展性。

BOOL __declspec(dllexport)__stdcall InstallHook(int nIDHook,const HINSTANCE hMod,DWORD dwThreadId)

{

         AFX_MANAGE_STATE(AfxGetStaticModuleState());

        

         BOOL bResult;

         HINSTANCE hInstance=NULL;

         if(hMod==NULL)

         {

                  hInstance=AfxGetInstanceHandle();

         }else

         {

                  hInstance=hMod;

         }

         switch(nIDHook)

         {

         case WH_CALLWNDPROC:

                  if(g_hWinProc!=NULL)

                  {

                          bResult=TRUE;

                          break;

                  }

                  g_hWinProc=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)ProcessWndProc,hInstance,dwThreadId);

                  if(g_hWinProc!=NULL)

                  {

                          bResult=TRUE;

                  }

                  break;

         case WH_GETMESSAGE:

                  if(g_hMsgProc!=NULL)

                  {

                          bResult=TRUE;

                          break;

                  }

                  g_hMsgProc=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)ProcessMsgProc,hInstance,dwThreadId);

                  if(g_hMsgProc!=NULL)

                  {

                          bResult=TRUE;

                  }

                  break;

         default:

                  bResult=FALSE;

                  break;

         }

         return bResult;

}

       下面这个函数用于卸载钩子,与前一个函数对应。

BOOL __declspec(dllexport)__stdcall  UninstallHook(int nIDHook)

{    

         BOOL bResult;

         switch(nIDHook)

         {

         case WH_CALLWNDPROC:

                  bResult=UnhookWindowsHookEx(g_hWinProc);

                  g_hWinProc=NULL;

                  break;

         case WH_GETMESSAGE:

                  bResult=UnhookWindowsHookEx(g_hMsgProc);

                  g_hMsgProc=NULL;

                  break;

         default:

                  bResult=TRUE;

         }

         return bResult;

}

       下面的函数就是对PostMessage发送的消息的响应函数,其中对鼠标滚轮事件进行了响应,使VB支持滚轮。

LRESULT __declspec(dllexport)__stdcall CALLBACK ProcessMsgProc(

                                   int nCode,      // hook code

                                   WPARAM wParam,  // current-process flag

                                   LPARAM lParam   // address of structure with message data

                                   )

{

         AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

         int n=0;

         MSG *pMessage=(MSG*)lParam;

         CWnd *pWnd=NULL;

         CWnd *pScroll=NULL;

         char buf[256];

         if(pMessage->message==WM_MOUSEWHEEL && g_bVBHelper)

         {

                  pWnd=CWnd::FromHandle(pMessage->hwnd);

                  if(pWnd!=NULL)

                  {

                          ::GetClassName(pMessage->hwnd,buf,255);

                          CString sWndClass(buf);

                           if(sWndClass.Compare("VbaWindow")==0)

                          {

                                   pScroll=pWnd->GetWindow(GW_CHILD);

                                   while(pScroll!=NULL)

                                   {

                                            ::GetClassName(pScroll->GetSafeHwnd(),buf,255);

                                            sWndClass.Format("%s",buf);

                                            if(sWndClass.Compare("ScrollBar")==0 && (pScroll->GetStyle()& SBS_VERT))

                                            {

                                                     break;

                                            }

                                            pScroll=pScroll->GetWindow(GW_HWNDNEXT);

                                   }

                                   if(((short) HIWORD(pMessage->wParam)<0))

                                   {

                                            ::SendMessage(pMessage->hwnd,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),(LPARAM)(pScroll==NULL?0:pScroll->GetSafeHwnd()));

                                            ::SendMessage(pMessage->hwnd,WM_VSCROLL,MAKEWPARAM(SB_ENDSCROLL,0),(LPARAM)(pScroll==NULL?0:pScroll->GetSafeHwnd()));

                                   }else if(((short) HIWORD(pMessage->wParam)>0))

                                   {

                                            ::SendMessage(pMessage->hwnd,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),(LPARAM)(pScroll==NULL?0:pScroll->GetSafeHwnd()));

                                            ::SendMessage(pMessage->hwnd,WM_VSCROLL,MAKEWPARAM(SB_ENDSCROLL,0),(LPARAM)(pScroll==NULL?0:pScroll->GetSafeHwnd()));

                                   }

                          }

                          return 0;

                  }

         }

         return  CallNextHookEx(g_hWinProc,nCode,wParam,lParam);

}

       从上面的代码不难看出,解决问题的关键在于,截获所需要的消息(WM_MOUSEWHEEL),并将该消息转化为响应的消息(WM_VSCROLL)发送给目的窗口。其中,需要注意的是:我们使用的是全局钩子,所以,它会截获所有窗体的消息,因此,在程序中就要对消息和窗体进行判断,对于不是我们所要的,就放行,是我们要的,就处理。

       通过该问题的分析,我们不难发现,可以使用类似的方法实现某些程序的最小化时隐藏等功能,即当收到特定窗口的最小化消息时,向它发送WM_SHOWWINDOW消息,然后在通知区生成一个对应图标,如果用户点击图标则显示窗口。

VB代码窗口鼠标滚轮的使用

VB6.0使用很长一段时间,代码有短的过程、少的行数到长的过程、多的行数。但当查看后面代码时,就不得不拖动滚动条,鼠标来回移动,感觉繁琐。之后知道可以使用鼠标滚轮时,并没有马上安装使用。一是感觉安装有...
  • songxuemeng
  • songxuemeng
  • 2013年08月13日 16:44
  • 1007

VB6.0代码窗口不支持鼠标中键操作滚动条解决方法

VB6.0代码窗口不支持鼠标中键操作滚动条解决方法 http://zgmgypb.blog.163.com/blog/static/962028192011107114648965/ 本文用来解决VB...
  • HWWBH
  • HWWBH
  • 2016年12月15日 20:19
  • 963

鼠标单击事件、滚轮事件,根据焦点缩放图片

var zoomLargeNum=110;//放大倍数 var zoomSmallNum=90; //缩小倍数 var zoomNum;         //中间变量 //鼠标滚轮滑动缩放图片 ...
  • wodehongseupan
  • wodehongseupan
  • 2013年03月16日 22:56
  • 792

OpenGL基础:glut处理鼠标事件(含滚轮输入)

检测鼠标单击  要想在OpenGL中处理鼠标事件非常的方便,GLUT已经为我们的注册好了函数,只要我们提供一个方法。使用函数glutMouseFunc,就可以帮我们注册我们的函数,这样当发生鼠标事件时...
  • Jacky_chenjp
  • Jacky_chenjp
  • 2017年04月06日 16:38
  • 5732

网页鼠标滚轮事件(滚滚屏)的获取及理解

问题?鼠标滚轮事件的获取及理解 什么是鼠标滚轮事件呢?
  • Mr_li13
  • Mr_li13
  • 2016年02月02日 00:57
  • 8401

坑爹的鼠标滚轮事件

事件绑定方式不同 IE 赋值/attachEvent Chrome 赋值/addEventListener Firefox...
  • maicss
  • maicss
  • 2015年05月16日 12:48
  • 872

针对不同浏览器的事件绑定以及鼠标滚轮事件

前段时间在看《JavaScript高级程序设计》第十三章-事件, 还没看完, 只是看到里面的一些内容觉得在这里做一个记录和总结会比较好. 首先先来讲解一下绑定事件一共有几种方式以及他们的特点和浏览器的...
  • u012863664
  • u012863664
  • 2017年01月30日 10:36
  • 471

[Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小

今天为大家分享的是在Rpg游戏中十分常见的鼠标滚轮调整摄像机视野效果,首先我们先创建一个游戏场景:         接下来我们编写一段脚本代码: using UnityEngine; using ...
  • qinyuanpei
  • qinyuanpei
  • 2014年04月05日 14:18
  • 11673

HTML中鼠标滚轮事件onmousewheel处理

滚轮事件是不同浏览器会有一点点区别,一个像Firefox使用DOMMouseScroll ,ff也可以使用addEventListener方法绑定DomMouseScroll事件,其他的浏览器滚轮事件...
  • jumtre
  • jumtre
  • 2016年04月11日 10:15
  • 4225

HTML5是如何使用鼠标滚轮事件的

你我都知道在HTML5网页中添加鼠标滚轮事件能够更好的让用户与网页进行交互操作。而在HTML5中,鼠标滚轮并不仅仅就只能上下滑动网页,实际上你还可以依靠这个完成更多的功能,比如视野平面的放大与缩小。 ...
  • jumtre
  • jumtre
  • 2016年04月11日 10:13
  • 1536
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让VB开发环境支持鼠标滚轮
举报原因:
原因补充:

(最多只允许输入30个字)