我要实现的功能是:
我的程序里有一个按钮,按下后,我把光标变掉。然后,当鼠标移出我的主窗体后仍然有用,并且不管在桌面的那个位置,即使鼠标已不在我自已窗体的区域内,都能触发mousemove事件给我的程序接收到。而其它程序收不到。当前按钮弹开后,这种控制取消。有一种方法是用全局HOOK接管鼠标的消息。但那需要做一个DLL。除了这种方法之后还有什么方法呢。我看过一个软件,可以在桌上自由画图。对其它程序没有影响。我要的就是那种功能。不知道是不是用HOOK的。希望大侠指点?

解决方案 »

  1.   

    不需要那么麻烦 在桌面上画图
    HWND hWndDesktop=GetDesktopWindow();或=HWND(0);
    hdc=GetWindowDC(hWndDesktop);
      

  2.   

    太简单了要给分的!!看下面的代码void CColorPickerDlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    GetDlgItem(IDC_STATIC_CURSOR)->ShowWindow(SW_HIDE);
    m_hCursor = SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_TAG));
    SetCapture();
    CDialogEx::OnLButtonDown(nFlags, point);
    }void CColorPickerDlg::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    SetCursor(m_hCursor);
    GetDlgItem(IDC_STATIC_CURSOR)->ShowWindow(SW_SHOW);
    ReleaseCapture();
    CDialogEx::OnLButtonUp(nFlags, point);
    }void CColorPickerDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if((nFlags & MK_LBUTTON ) != 0)
    {
    CString szText;
    ClientToScreen(&point); szText.Empty();
    szText.Format("X: %d   Y:  %d",point.x,point.y);
    SetDlgItemText(IDC_EDIT_MOUSE_POS,szText); CWnd *tagWnd = WindowFromPoint(point);
    szText.Empty();
    tagWnd->GetWindowText(szText);
    SetDlgItemText(IDC_EDIT_WIN_NAME,szText); CDC *pDC;

    pDC = tagWnd->GetWindowDC(); COLORREF m_Color;
    tagWnd->ScreenToClient(&point);
    m_Color = pDC->GetPixel(point);

    szText.Empty();
    szText.Format("RGB(%d,%d,%d)    #",GetRValue(m_Color),GetGValue(m_Color),GetBValue(m_Color)); szText += GetDataHexChar(GetRValue(m_Color));
    szText += GetDataHexChar(GetGValue(m_Color));
    szText += GetDataHexChar(GetBValue(m_Color)); SetDlgItemText(IDC_PICK_COLOR_EDIT,szText);
    } CDialog::OnMouseMove(nFlags, point);
    }
    在 LButtonDown 时使用 SetCapture();
    在 LButtonUp   时使用 ReleaseCapture();则可达到你要的要求,上面的例子是我做的取色器中的代码,取出其它窗口中鼠标处的色
      

  3.   


    不错,冥冥中我觉得应该有SetCapture();这样的函数。谢谢了。!