Advertisement
Levii_Valenok

Untitled

Nov 20th, 2022
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <setupapi.h>
  4. #include <iostream>
  5. #include <wdmguid.h>
  6. #include <devguid.h>
  7. #include <string>
  8. #include <iomanip>
  9. #include <conio.h>
  10. #include <vfw.h>
  11. #include <opencv2/core.hpp>
  12. #include <opencv2/videoio.hpp>
  13. #include <opencv2/highgui.hpp>
  14. #include <opencv2/imgproc.hpp>
  15.  
  16. using namespace std;
  17. using namespace cv;
  18. #pragma comment(lib, "setupapi.lib")
  19. #pragma comment(lib,"vfw32.lib")
  20.  
  21. HHOOK hHookKeyboard;
  22. HWND capture_handle;
  23. bool recording_video = false;
  24.  
  25. Mat src;
  26. void recordHiddenVideo();
  27. LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  28. {
  29.  
  30.     static bool window_is_hidden = false;
  31.     KBDLLHOOKSTRUCT* ks = (KBDLLHOOKSTRUCT*)lParam;     //contains information about the low-level keyboard input event
  32.     if (ks->vkCode == 0x1B)                             //esc - exit
  33.     {
  34.         TerminateProcess(GetCurrentProcess(), NO_ERROR);
  35.     }
  36.  
  37.  
  38.     if (ks->vkCode == 0x56 && (ks->flags & 0x80) == 0)  // V - start video
  39.     {
  40.         CAPTUREPARMS capparms;
  41.         capCaptureGetSetup(capture_handle, &capparms, sizeof(CAPTUREPARMS));
  42.  
  43.         capparms.fMakeUserHitOKToCapture = TRUE;    // show dialog box at start of recording
  44.         capparms.fYield = TRUE;                     // capture in background mode
  45.         capparms.fCaptureAudio = TRUE;              // sound capture
  46.         capparms.fAbortLeftMouse = FALSE;           // do not interrupt by clicking the left mouse button
  47.         capparms.fAbortRightMouse = FALSE;          // do not interrupt with the right mouse button
  48.         capparms.dwRequestMicroSecPerFrame = 33333; // ~30fps
  49.  
  50.         capCaptureSetSetup(capture_handle, &capparms, sizeof(CAPTUREPARMS));
  51.  
  52.         if (recording_video)
  53.         {
  54.             TerminateProcess(GetCurrentProcess(), NO_ERROR);
  55.         }
  56.     }
  57.     return CallNextHookEx(hHookKeyboard, nCode, wParam, lParam);
  58. }
  59. void printInfo() {
  60.     DWORD numberOfDevices = 0;
  61.     WCHAR name[256];
  62.     WCHAR description[256];
  63.  
  64.     for (int i = 0; i < 10; i++) {
  65.         if (capGetDriverDescriptionW(i,     //index of the capture driver
  66.             name,       //pointer to a buffer containing string corresponding to the capture driver name
  67.             255,        //length, in bytes, of the buffer pointed to by name
  68.             description,        //pointer to a buffer containing string corresponding to the description of the capture driver
  69.             255))       //length, in bytes, of the buffer pointed to by description
  70.         {
  71.             numberOfDevices++;
  72.             wcout << name << endl;
  73.             wcout << description << endl;
  74.         }
  75.     }
  76.  
  77.     if (numberOfDevices == 0) {
  78.         cout << "Webcam not found" << endl;
  79.         exit(1);
  80.     }
  81.  
  82.     SP_DEVINFO_DATA DeviceInfoData = { 0 };
  83.     HDEVINFO DeviceInfoSet = SetupDiGetClassDevsA(&GUID_DEVCLASS_CAMERA, "USB", NULL, DIGCF_PRESENT);
  84.     //Функция SetupDiGetClassDevs возвращает дескриптор набора сведений об устройстве(камера),
  85.     //который содержит запрашиваемые элементы.
  86.     if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
  87.         exit(1);
  88.     }
  89.  
  90.     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  91.     SetupDiEnumDeviceInfo(DeviceInfoSet, 0, &DeviceInfoData);
  92.     // 0 -Отсчитываемый от нуля индекс элемента информации об устройстве для извлечения.
  93.     //Функция SetupDiEnumDeviceInfo возвращает структуру SP_DEVINFO_DATA,
  94.     //которая содержит элементы информации
  95.  
  96.     char deviceName[256];
  97.     char deviceMfg[256];
  98.     SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)deviceName, sizeof(deviceName), 0);
  99.     SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, &DeviceInfoData, SPDRP_MFG, NULL, (PBYTE)deviceMfg, sizeof(deviceMfg), 0);
  100.  
  101.     //Функция SetupDiGetDeviceRegistryProperty извлекает указанное свойство устройства Plug and Play.
  102.     //SPDRP_FRIENDLYNAME - понятное имя устройства.
  103.     //SPDRP_MFG - имя производителя.
  104.     //последний параметр не обязательный, по умолчанию ставится 0
  105.  
  106.     SetupDiDestroyDeviceInfoList(DeviceInfoSet);
  107.     //функция удаляет информацию, и освобождает занятое место
  108.     cout <<  "Name: " << deviceName << endl;
  109. }
  110.  
  111. void recordVideo(int counter) {
  112.     VideoCapture cap_video(0 + CAP_DSHOW);
  113.  
  114.     if (!cap_video.isOpened()) {
  115.         cout << "Writer open error" << endl;
  116.         exit(1);
  117.     }
  118.  
  119.     cap_video >> src;
  120.  
  121.     VideoWriter writer;
  122.     int videoLength, codec;
  123.  
  124.     cout << "How long video is in seconds?" << endl;
  125.     cin >> videoLength;
  126.  
  127.     ShowWindow(GetConsoleWindow(), SW_SHOWNORMAL);
  128.     codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
  129.     string type = ".avi";
  130.     string filename = "video" + to_string(counter) + type;
  131.     writer.open(filename, codec, 10.0, src.size(), true);
  132.  
  133.     if (!writer.isOpened()) {
  134.         cout << "Writer open error" << endl;
  135.         exit(1);
  136.     }
  137.  
  138.     time_t timeStart;
  139.     time(&timeStart);
  140.     while (time(NULL) <= timeStart + videoLength) {
  141.         writer.write(src);
  142.         imshow("Live", src);
  143.         waitKey(60);
  144.         cap_video.read(src);
  145.         system("cls");
  146.     }
  147.     destroyAllWindows();
  148.     writer.release();
  149.     cap_video.release();
  150. }
  151.  
  152. void recordHiddenVideo() {
  153.     VideoCapture cap_video(0 + CAP_DSHOW);
  154.  
  155.     if (!cap_video.isOpened()) {
  156.         cout << "Writer open error" << endl;
  157.         exit(1);
  158.     }
  159.  
  160.     cap_video >> src;
  161.  
  162.     VideoWriter writer;
  163.     int videoLength, codec;
  164.  
  165.  
  166.     videoLength = 5;
  167.     ShowWindow(GetConsoleWindow(), SW_HIDE);
  168.     codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
  169.     string type = ".avi";
  170.     string filename = "hiddenVideo" + type;
  171.     writer.open(filename, codec, 10.0, src.size(), true);
  172.  
  173.     if (!writer.isOpened()) {
  174.         cout << "Writer open error" << endl;
  175.         exit(1);
  176.     }
  177.  
  178.     time_t timeStart;
  179.     time(&timeStart);
  180.     while (time(NULL) <= timeStart + videoLength) {
  181.         writer.write(src);
  182.         waitKey(60);
  183.         cap_video.read(src);
  184.     }
  185.     writer.release();
  186.     cap_video.release();
  187. }
  188.  
  189. void takePhoto(int counter) {
  190.     // Mat src;
  191.     VideoCapture cap_img(0 + CAP_DSHOW);
  192.  
  193.     cap_img >> src;
  194.     string type = ".jpg";
  195.     string fileName = "screen" + to_string(counter) + type;
  196.  
  197.     cap_img.read(src);
  198.     imwrite(fileName, src);
  199.  
  200.     cap_img.release();
  201. }
  202.  
  203. int main() {
  204.     char c;
  205.     int photoCounter = 0, videoCounter = 0, hiddenVideoCounter = 0;
  206.  
  207.    
  208.         cout << "p to get screen" << endl
  209.             << "v to get video" << endl
  210.             << "h to get hidden video" << endl
  211.             << "i to get info" << endl
  212.             << "q to exit" << endl;
  213.         cin >> c;
  214.         switch (c) {
  215.         case 'p':
  216.             photoCounter++;
  217.             takePhoto(photoCounter);
  218.             break;
  219.         case 'v':
  220.             videoCounter++;
  221.             recordVideo(videoCounter);
  222.             break;
  223.         case 'h':
  224.             hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);
  225.             ////Устанавливает определяемую приложением процедуру ловушки в цепочку ловушек.
  226.             ////Для мониторинга системы на предмет определенных типов событий. (скрытие процесса)
  227.             ////WH_KEYBOARD_LL - Устанавливает процедуру ловушки, которая отслеживает низкоуровневые события ввода с клавиатуры.
  228.             ////KeyboardProc - Указатель на процедуру ловушки.
  229.             ////Дескриптор библиотеки DLL, содержащей процедуру ловушки, обязательно NULL
  230.             ////Идентификатор потока, с которым должна быть связана процедура ловушки.
  231.             ////если ноль, процедура ловушки связана со всеми существующими потоками, работающими на том же рабочем столе, что и вызывающий поток.
  232.             hiddenVideoCounter++;
  233.             recordHiddenVideo();
  234.             break;
  235.         case 'i':
  236.             printInfo();
  237.             break;
  238.         case 'q':
  239.             return 0;
  240.         }
  241.    
  242.     while (1) {
  243.  
  244.     }
  245.  
  246.     return 0;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement