关于qq截屏软件

summer54 2006-01-03 04:34:03
请问qq截屏软件运行时, 其他窗口都无法用鼠标点击来获取焦点,这是怎么实现的?
...全文
811 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrSmart 2006-01-22
  • 打赏
  • 举报
回复
记录鼠标的起始和结束坐标,然后capture记住压缩,qq是jpg的
kx008 2006-01-22
  • 打赏
  • 举报
回复
用内存设备环境预先复制屏幕内容,OnPaint时将内存设备环境的内容复制到对话框,再处理对话框的ON_WM_ERASEBKGND消息,直接返回FALSE,屏幕基本上就不会闪了。
参考这份代码:

// CopyScreenDlg.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CCopyScreenDlg dialog

class CCopyScreenDlg : public CDialog
{
// Construction
public:
CCopyScreenDlg(CWnd* pParent = NULL); // standard constructor
~CCopyScreenDlg();

// Dialog Data
//{{AFX_DATA(CCopyScreenDlg)
enum { IDD = IDD_COPY_SCREEN };
// NOTE: the ClassWizard will add data members here
CDC m_MemoryDC;
CBitmap m_Bitmap;
HGDIOBJ m_hOldGdiObj;
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCopyScreenDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CCopyScreenDlg)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


// CopyScreenDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CopyScreenDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCopyScreenDlg dialog


CCopyScreenDlg::CCopyScreenDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCopyScreenDlg::IDD, pParent)
, m_hOldGdiObj(NULL)
{
//{{AFX_DATA_INIT(CCopyScreenDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}

CCopyScreenDlg::~CCopyScreenDlg()
{
m_Bitmap.DeleteObject();
m_MemoryDC.SelectObject(m_hOldGdiObj);
m_MemoryDC.DeleteDC();
}

void CCopyScreenDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCopyScreenDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCopyScreenDlg, CDialog)
//{{AFX_MSG_MAP(CCopyScreenDlg)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCopyScreenDlg message handlers

int CCopyScreenDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CRect rect;
GetDesktopWindow()->GetWindowRect(&rect);
MoveWindow(&rect, FALSE);
CDC* pDC = GetDC();
m_MemoryDC.CreateCompatibleDC(pDC);
// CBitmap Bitmap;
m_Bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
m_hOldGdiObj = m_MemoryDC.SelectObject(&m_Bitmap);
m_MemoryDC.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);

// Bitmap.DeleteObject();
ReleaseDC(pDC);

return 0;
}

BOOL CCopyScreenDlg::OnEraseBkgnd (CDC* pDC)
{
return FALSE;
}

void CCopyScreenDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CRect rect;
GetDesktopWindow()->GetWindowRect(&rect);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_MemoryDC, 0, 0, SRCCOPY);
// Do not call CDialog::OnPaint() for painting messages
}
pomelowu 2006-01-18
  • 打赏
  • 举报
回复
是有一个窗口的,不信你在截图开始以后按Alt+Tab看看。
kx008(奔三) 是对的。

怎么可能。。。建议你自己也做做试验看。另外,关于QQ的截屏,我也曾经想过这种放一个窗口上去的方法,不过窗口建立的时候始终会闪烁一下,无论SDK还是MFC,所以应该不是传统方式
EagleTwenty 2006-01-17
  • 打赏
  • 举报
回复
是有一个窗口的,不信你在截图开始以后按Alt+Tab看看。
kx008(奔三) 是对的。
pomelowu 2006-01-17
  • 打赏
  • 举报
回复
QQ开始截屏后,整个屏幕就不动了,应该是创建了一个无边框窗口并将当前屏幕显示的内容复制到这个窗口中,然后对该窗口进行区域截取的吧。

似乎没有窗口,用D3D表面截图的。
kx008 2006-01-17
  • 打赏
  • 举报
回复
QQ开始截屏后,整个屏幕就不动了,应该是创建了一个无边框窗口并将当前屏幕显示的内容复制到这个窗口中,然后对该窗口进行区域截取的吧。
summer54 2006-01-03
  • 打赏
  • 举报
回复
有人知道的,请告诉小弟一声
vcmute 2006-01-03
  • 打赏
  • 举报
回复
SetCapture 鼠标

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧