Узнать, что на рабочем столе произошли изменения %)

Тема в разделе "WASM.A&O", создана пользователем apple, 13 ноя 2006.

  1. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    В оригинале текст не сохранился, я его постоянно модифицировал, поубирал те ксоры и компрессию так как меня больше интерисовал не траф а загрузка проца (для незаметности ;) ) Сейчас кинул это все, 30% загрузки - мне не очень понравилось...
    То что сейчас осталось:

    Код (Text):
    1. DWORD   *pHashes;
    2. int     nHashes;
    3. HDC     hDeskDC;
    4. HDC     hBlockDC;
    5. HBITMAP hBlockBmp;
    6. void*   pMemBits;
    7. int     ScreenW;
    8. int     ScreenH;
    9.  
    10. DWORD CalcHash(void)
    11. {
    12.     DWORD Sum = 0;
    13.     for(int i = 0; i<BLOCKSIZE*BLOCKSIZE*MEMBYTESPP; i++) Sum+=((unsigned char*)pMemBits)[i]*i;
    14.     return Sum;
    15. }
    16.  
    17. void SendScreenshot(bool Init)
    18. {
    19.     DWORD TempHash;
    20.  
    21.     printstr("SendScreenshot");
    22.     if(Init) memset(pHashes, 0xff, nHashes*sizeof(DWORD));
    23.  
    24.     DataPacket.Header.Cmd = CMD_SCRDATA;
    25.     DataPacket.Header.dw1 = ScreenW;
    26.     DataPacket.Header.dw2 = ScreenH;
    27.  
    28.     hDeskDC = GetDC(NULL);
    29.     for(int i = 0; i<ScreenH/BLOCKSIZE; i++)
    30.     {
    31.         Sleep(2);
    32.         for(int j = 0; j<ScreenW/BLOCKSIZE; j++)
    33.         {
    34.             BitBlt(hBlockDC, 0, 0, BLOCKSIZE, BLOCKSIZE, hDeskDC, j*BLOCKSIZE, i*BLOCKSIZE, SRCCOPY);
    35.             GdiFlush();
    36.             TempHash = CalcHash();
    37.             if(pHashes[i*ScreenW/BLOCKSIZE+j] != TempHash || Init)
    38.             {
    39.                 pHashes[i*ScreenW/BLOCKSIZE+j] = TempHash;
    40.                 DataPacket.Header.dw3 = j;
    41.                 DataPacket.Header.dw4 = i;
    42.                 memcpy(&DataPacket.Data, pMemBits, BLOCKSIZE*BLOCKSIZE*MEMBYTESPP);
    43.                 sendto(s, (char*)&DataPacket, sizeof(DataPacket), 0, (sockaddr*)&SenderAddr, sizeof(sockaddr_in));
    44.             }
    45.         }
    46.     }
    47.     ReleaseDC(GetDesktopWindow(), hDeskDC);
    48. }
    49.  
    50. DWORD WINAPI WorkThread(LPVOID lpParameter)
    51. {
    52.     BITMAPINFO binfo;
    53.  
    54.     hDeskDC = GetDC(NULL);
    55.    
    56.     ScreenW = GetSystemMetrics(SM_CXSCREEN);
    57.     ScreenH = GetSystemMetrics(SM_CYSCREEN);
    58.  
    59.     nHashes = (ScreenW / BLOCKSIZE) * (ScreenH / BLOCKSIZE);
    60.     pHashes = new DWORD[nHashes];
    61.  
    62.     hBlockDC = CreateCompatibleDC(hDeskDC);
    63.     memset(&binfo, 0, sizeof(binfo));
    64.     binfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    65.     binfo.bmiHeader.biWidth = binfo.bmiHeader.biHeight = BLOCKSIZE;
    66.     binfo.bmiHeader.biBitCount=MEMBYTESPP*8;
    67.     binfo.bmiHeader.biPlanes=1;
    68.     binfo.bmiHeader.biCompression=BI_RGB;
    69.     hBlockBmp = CreateDIBSection(hBlockDC, &binfo, DIB_RGB_COLORS, &pMemBits, NULL, 0);
    70.     SelectObject(hBlockDC, hBlockBmp);
    71.  
    72.     ReleaseDC(GetDesktopWindow(), hDeskDC);
    73.  
    74.     SendScreenshot(true);
    75.     while(ThreadActive) SendScreenshot(false);
    76.  
    77.     DeleteObject(hBlockBmp);
    78.     DeleteDC(hBlockDC);
    79.     delete pHashes;
    80.     ExitThread(0);
    81. }
    А, забыл
    #define BLOCKSIZE 64 // размер участка
    #define MEMBYTESPP 3 // глубина цвета в байтах