这个事件仅仅是在一个窗口中有效吗???如果不是,为什么当我把鼠标通过该窗口上的控件(例如一个按钮)的时候,该事件中的代码就不会被执行呢???
还是有什么方法可以处理当鼠标通过控件的方法呢??
请指教~~

解决方案 »

  1.   

    用GetCursorPos获得当前鼠标位置
    或者用钩子钩WM_MOUSEMOVE事件
      

  2.   

    如果是想按钮触发这个WM_MOUSEMOVE事件的话,你应该派生一个新的按按钮类,
    然后用ClassWizard添加WM_MOUSEMOVE这个消息事件就OK了.
      

  3.   

    你应该设置该窗口上的控件的NOTIFY属性吧?!
      

  4.   

    void CXXXDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CBackupDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
              //别忘了在这个函数里面把你的控件ID和变量联系在一起.
              DDX_Control(pDX, IDC_BUTTON1, m_button1);
    //}}AFX_DATA_MAP
    }
      

  5.   

    这个事件仅仅是在一个窗口中有效吗???
    ==========================
    不是。当鼠标移动的时候,WM_MOUSEMOVE消息被post到一个窗口. 
    如果鼠标没有被捕捉,消息被post到包含鼠标光标的窗口,否则,消息被post到捕捉鼠标的那个窗口。
      

  6.   

    但当我把鼠标经过这个窗口上的控件时,WM_MOUSEMOVE就不起效了啊~~
    我就想知道怎么在控件上经过时也可以有效
      

  7.   

    这个你参考一下,详细参见http://blog.csdn.net/fraternity_java/archive/2004/09/18/109078.aspx//-------------------------------------------------------------------------// 导出函数列表
    // StartHook
    // StopHook
    // About#define _WIN32_WINNT  0x0500    // 设置系统版本, 确保可以使用底层鼠标钩子#include "windows.h"// 全局变量
    HINSTANCE g_hInstance = NULL;    // 模块实例句柄
    HHOOK  g_hHook = NULL;     // 钩子句柄// DLL 入口函数
    BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
     // 保存模块实例句柄
     g_hInstance = (HINSTANCE)hModule;
     
     // 在进程结束或线程结束时卸载钩子
     switch (ul_reason_for_call)
     {
     case DLL_PROCESS_ATTACH:
      break;
     case DLL_THREAD_ATTACH:
      break;
     case DLL_PROCESS_DETACH:
     case DLL_THREAD_DETACH:
      if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);
      break;
     }
        return TRUE;
    }// 底层鼠标钩子函数
    LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
     LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
     if (nCode>=0)
     {   
      if (wParam==WM_RBUTTONDBLCLK)
      {   
       HWND glhTargetWnd=pMouseHook->hwnd;   
       if(glhTargetWnd !=NULL)
       {
        char * buffer = NULL;
        if (OpenClipboard(NULL))
        {
         HANDLE hData = GetClipboardData(CF_TEXT);
         char * buffer = (char*)GlobalLock(hData);
         SetWindowText(glhTargetWnd,buffer);
         GlobalUnlock(hData);
         CloseClipboard();
         return TRUE;
        }    
       }
      }
     }
     // 传给系统中的下一个钩子
     return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    }//********************************************************************
    //* 安装鼠标钩子
    //* 参数: (无) 
    //* 返回值: TRUE 成功, FALSE 失败 
    //********************************************************************
    BOOL WINAPI StartHook()
    {
     // 如果已经安装鼠标钩子则返回 FALSE
     if (g_hHook != NULL) return FALSE;
     
     // 安装底层鼠标钩子
     g_hHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, g_hInstance, NULL);
     if (g_hHook == NULL) return FALSE;
     MessageBox(NULL,"启动成功!","BOBO鼠标双击右键粘贴器",MB_OK); return TRUE;
    }//********************************************************************
    //* 卸载鼠标钩子 
    //* 参数: (无) 
    //* 返回值: TRUE 成功, FALSE 失败
    //********************************************************************
    BOOL WINAPI StopHook()
    {
     // 卸载钩子
     if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;
     g_hHook = NULL;
     MessageBox(NULL,"卸载成功!","BOBO鼠标双击右键粘贴器",MB_OK); return TRUE;
    }
      

  8.   

    WM_MOUSEMOVE消息应该是先由父窗口接受再路由到按钮的。所以可以在窗口的消息泵路由WM_MOUSEMOVE时,更改其流向及数据,使其不被转发给按钮。例如下面的处理:(这是新建的一个对话框工程,在对话框上随便添加一个按钮,把面积调大一些,ID设为IDC_BUTTON1,覆盖以下两个函数,你可以看到覆盖PreTranslateMessage前后的不同表现)(只是演示,没有考虑规范等其它方面)
    void CWyDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    static int i = 0;
    i++;
    GetDC()->TextOut(0,0,"                       ");
    GetDC()->TextOut((i*10)%100,0,"s");
    GetDC()->TextOut(point.x,point.y,".");
    CDialog::OnMouseMove(nFlags, point);
    }BOOL CWyDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_MOUSEMOVE && pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
    {
    GetDC()->TextOut(0,20,"s");
    CPoint p;
    p.x = GET_X_LPARAM(pMsg->lParam); 
    p.y = GET_Y_LPARAM(pMsg->lParam); 
    GetDlgItem(IDC_BUTTON1)->ClientToScreen(&p);
    this->ScreenToClient(&p);
    pMsg->pt = p;
    pMsg->lParam = MAKELPARAM(p.x,p.y);
    pMsg->hwnd = this->m_hWnd;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }