让VB开发环境支持鼠标滚轮.doc_第1页
让VB开发环境支持鼠标滚轮.doc_第2页
让VB开发环境支持鼠标滚轮.doc_第3页
让VB开发环境支持鼠标滚轮.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

让VB开发环境支持鼠标滚轮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();elsehInstance=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 codeWPARAM wParam, / current-process flagLPARAM 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 buf256;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)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)发送给目的窗口。其中,需要注意的是:我们使用的是全局钩子,所以,它会截获所有窗体的消息,因此,在程序中就要对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论