对于qq截图,启动后当鼠标落在一个窗口或一个子控件窗口上,会显示一个自动套索的效果,可供选择。一般截图的实现办法是:先将当前屏幕截图,然后启动一个对话框,将对话框全屏,将灰化后的截图画到对话框上,从而实现初始的界面灰化的效果。当用户拖动矩形框选择区域后,将选中区域的截图再贴到对话框上,实现选择区域的亮色显示。如果要实现窗口或子控件窗口的自动套索效果,那如何知道当前鼠标落在哪个窗口上或子控件窗口上?是启动时枚举所有的窗口将窗口的位置记下来,当启动后根据鼠标所在的区域来判断自动套索哪个窗口?但子控件窗口怎么处理呢?怎么知道哪些窗口位置有所重叠了呢?
楼主看一下这个。
void CScreenCaptureDlg::OnCutscreen()
{
ShowWindow( SW_HIDE );
Sleep( 100 );
CCaptureScreen csDlg;
if( IDCANCEL == csDlg.DoModal() )
{
DeleteDC( csDlg.m_hScreenDC );
ShowWindow( SW_SHOW );
return;
}
HWND hwnd = ( HWND ) ::WindowFromPoint( csDlg.m_ptEnd );
CRect rect;
::GetWindowRect( hwnd, &rect ); if( csDlg.m_bActiveWindow && ::IsWindow( hwnd ) )
{
CaptureScreen( csDlg.m_hScreenDC, rect );
}
else
{
int i = csDlg.m_rect.left;
int k = csDlg.m_rect.right;
int m = csDlg.m_rect.top;
int n = csDlg.m_rect.bottom;
CaptureScreen( csDlg.m_hScreenDC, csDlg.m_rect );
}
DeleteDC( csDlg.m_hScreenDC );
ShowWindow( SW_SHOW );}关键代码HWND hwnd = ( HWND ) ::WindowFromPoint( csDlg.m_ptEnd );
得到鼠标所位置的窗口,下面的就简单了。
http://www.cppblog.com/weiym/archive/2012/05/06/173845.html
http://www.vcproj.net/qq-screenshots-windows-automatically-recognizes-the-principle/
http://download.csdn.net/download/hihusir/4379892在此和大家分享一下!