对于qq截图,启动后当鼠标落在一个窗口或一个子控件窗口上,会显示一个自动套索的效果,可供选择。一般截图的实现办法是:先将当前屏幕截图,然后启动一个对话框,将对话框全屏,将灰化后的截图画到对话框上,从而实现初始的界面灰化的效果。当用户拖动矩形框选择区域后,将选中区域的截图再贴到对话框上,实现选择区域的亮色显示。如果要实现窗口或子控件窗口的自动套索效果,那如何知道当前鼠标落在哪个窗口上或子控件窗口上?是启动时枚举所有的窗口将窗口的位置记下来,当启动后根据鼠标所在的区域来判断自动套索哪个窗口?但子控件窗口怎么处理呢?怎么知道哪些窗口位置有所重叠了呢?

解决方案 »

  1.   

    http://qiusuoge.com/9242.html
    楼主看一下这个。
      

  2.   


    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 );
    得到鼠标所位置的窗口,下面的就简单了。
      

  3.   

    我想可以先利用窗口的z-order分布的原则来判断父窗口中,哪个在前,哪个在后,用EnumWindows,先记录顶层到底层的窗口,根据层级的优先级来用EnumChildWindows来记录每个窗口的位置
      

  4.   

    windowfrompoint  不好用么
      

  5.   

    感谢大家的热心回复!现在的截图实现机制:启动截图操作时,先截取当前的屏幕保存到内存中,然后置顶显示一个全屏对话框,将内存中的屏幕截图做灰化处理,将绘画后的图片贴到对话框上,实现初始的灰化效果。由于使用到了一个置顶对话框,所以windowfrompoint好像就不好用了,大家在帮忙看看有没有其他好的办法?
      

  6.   

    刚才使用spy++看了一下某一指定的窗口(用spy++监看该窗口的消息),QQ启动截图后移动光标到该指定的窗口上来回移动多次,该指定的窗口并没有产生与移动相关的消息,即鼠标没有真正的在该指定窗口上移动。
      

  7.   

    好像找到了解决办法:
    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在此和大家分享一下!