悬挂窗口像QQ中的那样.doc_第1页
悬挂窗口像QQ中的那样.doc_第2页
悬挂窗口像QQ中的那样.doc_第3页
悬挂窗口像QQ中的那样.doc_第4页
悬挂窗口像QQ中的那样.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

仿QQ悬挂窗口的实现2010-07-20 20:46:10来源:WEB开发网【减小字体增大字体】关注龙振升的微博核心提示:上过QQ的朋友们都知道,当QQ窗口位于桌面的左边界、右边界或顶部的时候,仿QQ悬挂窗口的实现,QQ会自动隐藏起来;而一旦鼠标再次接触到上述边界的时候,QQ窗口又会自动展开,没有想到鼠标不移动也会产生此鼠标过程,/真让我大吃一惊,QQ的这种特效在一定程度上大大的节约了桌面资源,给使用者带来的方便上过QQ的朋友们都知道,当QQ窗口位于桌面的左边界、右边界或顶部的时候,QQ会自动隐藏起来;而一旦鼠标再次接触到上述边界的时候,QQ窗口又会自动展开。QQ的这种特效在一定程度上大大的节约了桌面资源,给使用者带来的方便。QQ悬挂窗口主要特点就是结合窗口以及鼠标的位置,并通过鼠标事件来调整窗口的显示方式。其中,窗口以及鼠标的位置可以通过GetWindowRect和GetCursorPos这两个函数来获取,故如何获取鼠标事件成为QQ悬挂窗口实现的关键。对于一个窗口来说,按鼠标事件的触发位置,鼠标事件可以分为三类:1. 客户区鼠标消息:鼠标在窗口的客户区移动时产生的消息,此消息是标准的鼠标消息,MFC中通过WM_MOUSEMOVE这个事件解决了这个问题。2. 非客户区鼠标消息:鼠标在非客户区以外(标题栏、框架等)移动时产生的消息,此消息是标准的鼠标消息,MFC中通过WM_NCMOUSEMOVE这个事件解决了这个问题。3. 窗口以外的鼠标消息:鼠标不在本窗口移动时产生的消息,此消息不是标准的鼠标消息,在MFC中也找不到这样的事件。那该如何捕获这样的鼠标消息呢?窗口以外的鼠标消息必然是发生在其他窗口上的,此鼠标消息是发往其他窗口的消息队列中,由其他窗口的消息队列所维护。不过,我们可以通过设置全局鼠标钩子来监视鼠标的位置,并触发鼠标消息。如果将鼠标钩子设置在窗口内部设置的话,那此鼠标钩子仅能够监视到上述鼠标事件的前两类事件,而不能够监视到本窗口以外的鼠标消息,并不是真正的全局鼠标钩子。如果将鼠标钩子设置在DLL中,那么鼠标在整个屏幕上所发生的事件都会被这个鼠标过程所监察到,即可以捕获其他窗口的鼠标消息并将此鼠标消息发往本窗口的所属线程的消息队列中。在本窗口中,必须将本窗口的线程ID传到DLL中,使DLL能够将其他鼠标事件发到指定线程的消息队列中。具体实现如下:/-/ Function: SetHook - Creates mouse hook (Exported), called by CAppBarMngr/ Arguments: _id - Calling thread ID, used to send message to it/ _width - Width of window/ _left - True if window is left side docked, false if not/ Returns: False if it is already hooked/ True if hook has been created/-BOOL SetHook(DWORD _id, int _width, BOOL _left) if (s_ThreadID) return FALSE; / Already hooked! s_Width = _width; s_Left = _left; g_Hook = :SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, g_Instance, 0); s_ThreadID = _id; return TRUE; / Hook has been created correctly/-/ Function: MouseProc - Callback function for mouse hook/ Arguments: nCode - action code, according to MS documentation, must return/ inmediatly if less than 0/ wParam - not used/ lParam - not used/ Returns: result from next hook in chain/-static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) static LRESULT lResult; / Made static to accelerate processing static POINT pt; / idemif (nCodemessage)case WM_USER+1000:POINT pt;CRect rcWindow;:GetCursorPos(&pt);GetWindowRect(&rcWindow);if(pt.xrcWindow.top & pt.yrcWindow.bottom)if(rcWindow.left1 & rcWindow.Width()1) SliderWindow(LEFT, true); else if(rcWindow.left99) else if(rcWindow.left1 & rcWindow.Width()99) else else if(pt.yrcWindow.bottom) if(rcWindow.left1 & rcWindow.Width()1) else if(rcWindow.left99)SliderWindow(LEFT, false); else if(rcWindow.left1 & rcWindow.Width()99) elseelse if(pt.x0 & pt.x100)if(rcWindow.left1 & rcWindow.Width()rcWindow.top & pt.yrcWindow.bottom) else if(rcWindow.left99)/SliderWindow(LEFT, true);else if(rcWindow.left1 & rcWindow.Width()99) else elseif(rcWindow.left1 & rcWindow.Width()1) else if(rcWindow.left99 & (pt.yrcWindow.top & pt.y1 & rcWindow.Width()99) else break;default:break;return CDialog:PreTranslateMessage(pMsg);void CHookTestDlg:SliderWindow(int nPos, bool bShow)CRect rc;GetWindowRect(rc);int nSrcWidth = :GetSystemMetrics(SM_CXSCREEN);switch(nPos)case LEFT:if(bShow)for(int i=0; i=10; i+)SetWindowPos(&CWnd:wndTopMost, 0, rc.top, i*10, rc.Height(), SWP_SHOWWINDOW);Sleep(20); else for(int i=0; i=10; i+)SetWindo

温馨提示

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

评论

0/150

提交评论