我要实现的功能是:
我的程序里有一个按钮,按下后,我把光标变掉。然后,当鼠标移出我的主窗体后仍然有用,并且不管在桌面的那个位置,即使鼠标已不在我自已窗体的区域内,都能触发mousemove事件给我的程序接收到。而其它程序收不到。当前按钮弹开后,这种控制取消。有一种方法是用全局HOOK接管鼠标的消息。但那需要做一个DLL。除了这种方法之后还有什么方法呢。我看过一个软件,可以在桌上自由画图。对其它程序没有影响。我要的就是那种功能。不知道是不是用HOOK的。希望大侠指点?
我的程序里有一个按钮,按下后,我把光标变掉。然后,当鼠标移出我的主窗体后仍然有用,并且不管在桌面的那个位置,即使鼠标已不在我自已窗体的区域内,都能触发mousemove事件给我的程序接收到。而其它程序收不到。当前按钮弹开后,这种控制取消。有一种方法是用全局HOOK接管鼠标的消息。但那需要做一个DLL。除了这种方法之后还有什么方法呢。我看过一个软件,可以在桌上自由画图。对其它程序没有影响。我要的就是那种功能。不知道是不是用HOOK的。希望大侠指点?
HWND hWndDesktop=GetDesktopWindow();或=HWND(0);
hdc=GetWindowDC(hWndDesktop);
{
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();则可达到你要的要求,上面的例子是我做的取色器中的代码,取出其它窗口中鼠标处的色
不错,冥冥中我觉得应该有SetCapture();这样的函数。谢谢了。!