我想问下,象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)
{
static CPoint pt_start=0;
static CPoint pt_end=0;
if(wParam==WM_LBUTTONDOWN)pt_start=((MOUSEHOOKSTRUCT*)lParam)->pt;
if(wParam==WM_LBUTTONDOWN)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);
}
真的需要大家的帮助啊。
如果哪里犯了错误,请告诉我,我也是刚接触这东西的。
[此贴子已经被作者于2006-9-19 23:41:52编辑过]