我想问下,象QQ一样的屏幕截图程序需要利用钩子吗?因为如果不用的话,那么鼠标点击其他窗口就不会有那种截图的效果啊,所以用WH_MOUSE可以吗?我本来是这样想的,在一个BUTTON控件上添加消息响应,在那个函数里安装一个钩子(对系统鼠标消息都先调用它),然后鼠标消息监控,当鼠标点击以后得到他的坐标,在它UP的时候得到第2个坐标,当双击那快矩形的里面时,把这块矩形的图形COPY到自己的类中去,并解除钩子;或则按EXE时(VK_ESCAPE)时,也解除钩子。这样是对的吗?HHOOK hhk_mouse,hhk_keyboard;
hhk_mouse=SetWindowsHookEx(WH_MOUSE,CutBitmapFromDeskTop,AfxGetApp().m_hInstance,0);
hhk_keyboard=SetWindowsHookEx(WH_KEYBOARD,CheckEscape,AfxGetApp().m_hInstance,0);
LRESULT CALLBACK CutBitmapFromDeskTop(int nCode,WPARAM wParam,LPARAM lParam)
{
    if(wParam==WM_LBUTTONDOWN)static CPoint pt_start=((MOUSEHOOKSTRUCT*)lParam)->pt;
    if(wParam==WM_LBUTTONDOWN)static CPoint pt_end=((MOUSEHOOKSTRUCT*)lParam)->pt;
    ::gobal_rc=CRect(pt_start,pt_end);   //gobal_rc是一个全局的矩形,存储位置。
    if(wParam==WM_LDBUTTONDOWN&&gobal_rc.PtInRect(((MOUSEHOOKSTRUCT*)lParam)->pt))
    {
         StrectBlt(...);      //把区域内的图形拷贝到指定区域
         UnhookWindowsHookEx(hhk_mouse);
         UnhookWindowsHookEx(hhk_keyboard);
    }
    return CallNextHookEx(nCode,wParam,lParam);
    
    
}
LRESULT CALLBACK CheckEscape(int nCode,WPARAM wParam,LPARAM lParam)
{
    if(wParam==VK_ESCAPE)
    {
         UnhookWindowsHookEx(hhk_mouse);
         UnhookWindowsHookEx(hhk_keyboard);
    }
    return CallNextHookEx(nCode,wParam,lParam);
}真的需要大家的帮助啊。如果哪里犯了错误,请告诉我,我也是刚接触这东西的