Полезные исходники для Windows

Всё, что касается программирования на старых языках или для старых систем

Re: Полезные исходники для Windows

Сообщение Fido_point » 26 сен 2023, 20:35

rvg писал(а):
longhorn_gnu писал(а):Так зачем она нужна? Как ей пользоваться?

Вообще. Не вникли? Ладно. Итак. У меня компьютер (два-два рубля родственник, Афоня должен (с) Афоня [кино Георгия Данелии если не ошибаюсь, год точно семьдесят пятый]). Я часто всё стираю/переустанавливаю. Иногда у меня все винчестеры пусты. Отеразены Ераской, пройдены Mhdd.
Есть болванка и не одна на ней наработки и инструмент используемый годами - вот только емкость всего четыре гигабайта (флешки есть но они не надежны, особенно сегодняшнего выпуска). Часто работаю лишь с CD/Dvd привода. Можно и записывать, но это (ну одним словом не гожэ это).
Итак. Регистрируешься на сайте форума МуБб там в профиль можно грузить картинки аж десять мегабайт, сервер не перезаписывает картинку - приклееный архив остается. Ну понятно?


Кароче халявное облачное хранилище по сути.
Изображение
Аватара пользователя
Fido_point
Мастер Даунгрейда
 
Сообщения: 212
Зарегистрирован: 08 мар 2023, 18:14
Откуда: Молодечно, Беларусь

Re: Полезные исходники для Windows

Сообщение rvg » 26 сен 2023, 20:41

Fido_point писал(а):Кароче халявное облачное хранилище по сути.

Можно и так сказать.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение rvg » 26 сен 2023, 20:42

8-)
Последний раз редактировалось rvg 30 сен 2023, 11:34, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение Fido_point » 26 сен 2023, 21:04

rvg писал(а):
Fido_point писал(а):Кароче халявное облачное хранилище по сути.

Можно и так сказать.

Сомнительное занятие. В чем проблема юзать бесплатные облака? Их же много сейчас. Небезопасно?
Изображение
Аватара пользователя
Fido_point
Мастер Даунгрейда
 
Сообщения: 212
Зарегистрирован: 08 мар 2023, 18:14
Откуда: Молодечно, Беларусь

Re: Полезные исходники для Windows

Сообщение rvg » 26 сен 2023, 21:13

:?
Последний раз редактировалось rvg 30 сен 2023, 11:34, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение Fido_point » 26 сен 2023, 21:15

rvg писал(а):
Fido_point писал(а):Сомнительное занятие. В чем проблема юзать бесплатные облака? Их же много сейчас. Небезопасно?

А кто сказал что нужно их юзать? Клеить можно всё что угодно и догадаться в лежащей картинке или ролике о сурпрайзе - проблематично :P
Бросьте. Это также показывает приём монтирования файлов. Так..


Короче очень полезная программа. Я понял)))
Изображение
Аватара пользователя
Fido_point
Мастер Даунгрейда
 
Сообщения: 212
Зарегистрирован: 08 мар 2023, 18:14
Откуда: Молодечно, Беларусь


Захват видео с Web-камеры

Сообщение rvg » 27 сен 2023, 09:21

Захват видео с Web-камеры. Длительность захвата семь секунд.
Собрать программу можно лишь Visual Studio (минимальная версия 6.0).
 Развернуть: CapAvi.cpp
Код: Выделить всё
// CapAvi.cpp
//
// Захват видео с Web-камеры.

#pragma comment(lib,"vfw32.lib")
#include <windows.h>
#include <vfw.h>

#define   TIMER_LIMIT   7 /* Длительность захвата семь секунд. */

char* GWndname="wnd_capavi";
char* GAppname="Capture Avi'";

void mb(char*);
char* appBaseDir();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
   char svBuffer[1024];
   char svName[256];
   char svComment[512];
   WORD wDriverIndex=0;

   /* Проверка доступности видеокамеры. */
   for(int i=0;i<5;++i) {
      if(capGetDriverDescription(wDriverIndex,svName,255,svComment,512)) {
         wsprintf(svBuffer,"%d: %s %s",wDriverIndex,svName,svComment);
         ++wDriverIndex;
      }
   }

   if(!wDriverIndex)
   mb("Failed - missing video device.");
   //wsprintf(svBuffer,"%d devices listed",wDriverIndex);
   --wDriverIndex;

   /* Захват будет длиться секунд пятнадцать. Продолжить? */
   int idResponse=MessageBox(HWND_DESKTOP,
   "Capture from WebCam\nProcedure 10-15 Seconds\nContinued?",
   GAppname,MB_YESNO | MB_ICONQUESTION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL);
   if(IDNO==idResponse)
   return 0;

   WNDCLASSEX wcex={sizeof(WNDCLASSEX),0,DefWindowProc,
   0,0,hInstance,NULL,NULL,NULL,NULL,GWndname,NULL,};

   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom)
      mb("Failed register class");
   }

   HWND hWnd=CreateWindowEx(0,MAKEINTATOM(Atom),
   GAppname,0,0,0,0,0,HWND_DESKTOP,NULL,hInstance,NULL);
   if(!hWnd)
   mb("Failed create window");

   /* Создать имя для захватываемого файла. */
   GetDateFormat(LOCALE_SYSTEM_DEFAULT,0,NULL,"ddMMyy_",svName,63);

   char svFilename[MAX_PATH];
   wsprintf(svFilename,"%s%sCap001.avi",appBaseDir(),svName);

   HWND hwndCap=capCreateCaptureWindow("wnd_cap",WS_CHILD,0,0,160,120,hWnd,1);
   if(!hwndCap)
   mb("Failed capCreateCaptureWindow");

   if(!capDriverConnect(hwndCap,wDriverIndex)) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - unable to connect to driver #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   CAPDRIVERCAPS pcdc;
   capDriverGetCaps(hwndCap,&pcdc,sizeof(CAPDRIVERCAPS));
   if(!pcdc.fCaptureInitialized) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - driver was not initialized for device #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   DWORD dwSize=capGetVideoFormatSize(hwndCap);
   BITMAPINFO* pbiOrig=(BITMAPINFO*)malloc(dwSize);
   if(!pbiOrig) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error.");
   }

   BITMAPINFO* pbiInfo=(BITMAPINFO*)malloc(dwSize);
   if(!pbiInfo) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error (#2).");
   }

   capGetVideoFormat(hwndCap,pbiOrig,dwSize);
   memcpy(pbiInfo,pbiOrig,dwSize);

   DWORD dwBPP=16;   // Глубина цвета (Deep color)
   DWORD dwFPS=15;   // Частота кадров (Fps)
   DWORD dwWidth=160;   // Ширина
   DWORD dwHeight=120;   // Высота

   pbiInfo->bmiHeader.biWidth=dwWidth;
   pbiInfo->bmiHeader.biHeight=dwHeight;
   pbiInfo->bmiHeader.biBitCount=(WORD)dwBPP;

   pbiInfo->bmiHeader.biPlanes=1;
   pbiInfo->bmiHeader.biClrUsed=0;
   pbiInfo->bmiHeader.biSizeImage=0;
   pbiInfo->bmiHeader.biClrImportant=0;
   pbiInfo->bmiHeader.biCompression=BI_RGB;
   
   pbiInfo->bmiColors->rgbRed=0;
   pbiInfo->bmiColors->rgbBlue=0;
   pbiInfo->bmiColors->rgbGreen=0;
   pbiInfo->bmiColors->rgbReserved=0;

   CAPTUREPARMS capparms;
   capSetVideoFormat(hwndCap,pbiInfo,dwSize);

   capCaptureGetSetup(hwndCap,&capparms,
   sizeof(CAPTUREPARMS));

   capparms.vKeyAbort=0;
   capparms.wTimeLimit=TIMER_LIMIT;
   capparms.fLimitEnabled=TRUE;
   capparms.fAbortLeftMouse=FALSE;
   capparms.fAbortRightMouse=FALSE;
   capparms.fMakeUserHitOKToCapture=FALSE;
   capparms.dwRequestMicroSecPerFrame=(1000000/dwFPS);

   capCaptureSetSetup(hwndCap,&capparms,sizeof(CAPTUREPARMS));
   capFileSetCaptureFile(hwndCap,svFilename);
   capCaptureSequence(hwndCap);
   capSetVideoFormat(hwndCap,pbiOrig,dwSize);
   capDriverDisconnect(hwndCap);
   DestroyWindow(hwndCap);

   /* Возпроизвести захваченную запись? */
   wsprintf(svBuffer,"Video record successful.\n\nPlay videos?\n%s",svFilename);
   if(IDYES==MessageBox(hWnd,svBuffer,GAppname,
   MB_YESNO | MB_ICONQUESTION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL))
   ShellExecute(0,"open",svFilename,NULL,NULL,SW_SHOWNORMAL);

   return 0;
}

void mb(char* Str)
{
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(Str,"Failed") || strstr(Str,"Error"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),Str,GAppname,uType);
   if(n)
   ExitProcess(n);
}

char* appBaseDir()
{
   static char Result[MAX_PATH];
   if(!Result[0]) {
      GetModuleFileName(GetModuleHandle(NULL),Result,MAX_PATH);
      int i;
      for(i=lstrlen(Result)-1;i>0;--i) {
         if('\\'==Result[i-1] || '/'==Result[i-1])
         break;
      }
      Result[i]=0;
   }
   return Result;
}
Вложения
CapAvi1.gif
CapAvi1.gif (105.18 Кб) Просмотров: 11817
CapAvi.zip
(14.98 Кб) Скачиваний: 451
Последний раз редактировалось rvg 27 сен 2023, 09:22, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Захват видео с Web-камеры

Сообщение longhorn_gnu » 27 сен 2023, 10:31

rvg писал(а):Захват видео с Web-камеры. Длительность захвата семь секунд.
Собрать программу можно лишь Visual Studio (минимальная версия 6.0).
 Развернуть: CapAvi.cpp
Код: Выделить всё
// CapAvi.cpp
//
// Захват видео с Web-камеры.

#pragma comment(lib,"vfw32.lib")
#include <windows.h>
#include <vfw.h>

#define   TIMER_LIMIT   7 /* Длительность захвата семь секунд. */

char* GWndname="wnd_capavi";
char* GAppname="Capture Avi'";

void mb(char*);
char* appBaseDir();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
   char svBuffer[1024];
   char svName[256];
   char svComment[512];
   WORD wDriverIndex=0;

   /* Проверка доступности видеокамеры. */
   for(int i=0;i<5;++i) {
      if(capGetDriverDescription(wDriverIndex,svName,255,svComment,512)) {
         wsprintf(svBuffer,"%d: %s %s",wDriverIndex,svName,svComment);
         ++wDriverIndex;
      }
   }

   if(!wDriverIndex)
   mb("Failed - missing video device.");
   //wsprintf(svBuffer,"%d devices listed",wDriverIndex);
   --wDriverIndex;

   /* Захват будет длиться секунд пятнадцать. Продолжить? */
   int idResponse=MessageBox(HWND_DESKTOP,
   "Capture from WebCam\nProcedure 10-15 Seconds\nContinued?",
   GAppname,MB_YESNO | MB_ICONQUESTION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL);
   if(IDNO==idResponse)
   return 0;

   WNDCLASSEX wcex={sizeof(WNDCLASSEX),0,DefWindowProc,
   0,0,hInstance,NULL,NULL,NULL,NULL,GWndname,NULL,};

   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom)
      mb("Failed register class");
   }

   HWND hWnd=CreateWindowEx(0,MAKEINTATOM(Atom),
   GAppname,0,0,0,0,0,HWND_DESKTOP,NULL,hInstance,NULL);
   if(!hWnd)
   mb("Failed create window");

   /* Создать имя для захватываемого файла. */
   GetDateFormat(LOCALE_SYSTEM_DEFAULT,0,NULL,"ddMMyy_",svName,63);

   char svFilename[MAX_PATH];
   wsprintf(svFilename,"%s%sCap001.avi",appBaseDir(),svName);

   HWND hwndCap=capCreateCaptureWindow("wnd_cap",WS_CHILD,0,0,160,120,hWnd,1);
   if(!hwndCap)
   mb("Failed capCreateCaptureWindow");

   if(!capDriverConnect(hwndCap,wDriverIndex)) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - unable to connect to driver #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   CAPDRIVERCAPS pcdc;
   capDriverGetCaps(hwndCap,&pcdc,sizeof(CAPDRIVERCAPS));
   if(!pcdc.fCaptureInitialized) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - driver was not initialized for device #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   DWORD dwSize=capGetVideoFormatSize(hwndCap);
   BITMAPINFO* pbiOrig=(BITMAPINFO*)malloc(dwSize);
   if(!pbiOrig) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error.");
   }

   BITMAPINFO* pbiInfo=(BITMAPINFO*)malloc(dwSize);
   if(!pbiInfo) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error (#2).");
   }

   capGetVideoFormat(hwndCap,pbiOrig,dwSize);
   memcpy(pbiInfo,pbiOrig,dwSize);

   DWORD dwBPP=16;   // Глубина цвета (Deep color)
   DWORD dwFPS=15;   // Частота кадров (Fps)
   DWORD dwWidth=160;   // Ширина
   DWORD dwHeight=120;   // Высота

   pbiInfo->bmiHeader.biWidth=dwWidth;
   pbiInfo->bmiHeader.biHeight=dwHeight;
   pbiInfo->bmiHeader.biBitCount=(WORD)dwBPP;

   pbiInfo->bmiHeader.biPlanes=1;
   pbiInfo->bmiHeader.biClrUsed=0;
   pbiInfo->bmiHeader.biSizeImage=0;
   pbiInfo->bmiHeader.biClrImportant=0;
   pbiInfo->bmiHeader.biCompression=BI_RGB;
   
   pbiInfo->bmiColors->rgbRed=0;
   pbiInfo->bmiColors->rgbBlue=0;
   pbiInfo->bmiColors->rgbGreen=0;
   pbiInfo->bmiColors->rgbReserved=0;

   CAPTUREPARMS capparms;
   capSetVideoFormat(hwndCap,pbiInfo,dwSize);

   capCaptureGetSetup(hwndCap,&capparms,
   sizeof(CAPTUREPARMS));

   capparms.vKeyAbort=0;
   capparms.wTimeLimit=TIMER_LIMIT;
   capparms.fLimitEnabled=TRUE;
   capparms.fAbortLeftMouse=FALSE;
   capparms.fAbortRightMouse=FALSE;
   capparms.fMakeUserHitOKToCapture=FALSE;
   capparms.dwRequestMicroSecPerFrame=(1000000/dwFPS);

   capCaptureSetSetup(hwndCap,&capparms,sizeof(CAPTUREPARMS));
   capFileSetCaptureFile(hwndCap,svFilename);
   capCaptureSequence(hwndCap);
   capSetVideoFormat(hwndCap,pbiOrig,dwSize);
   capDriverDisconnect(hwndCap);
   DestroyWindow(hwndCap);

   /* Возпроизвести захваченную запись? */
   wsprintf(svBuffer,"Video record successful.\n\nPlay videos?\n%s",svFilename);
   if(IDYES==MessageBox(hWnd,svBuffer,GAppname,
   MB_YESNO | MB_ICONQUESTION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL))
   ShellExecute(0,"open",svFilename,NULL,NULL,SW_SHOWNORMAL);

   return 0;
}

void mb(char* Str)
{
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(Str,"Failed") || strstr(Str,"Error"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),Str,GAppname,uType);
   if(n)
   ExitProcess(n);
}

char* appBaseDir()
{
   static char Result[MAX_PATH];
   if(!Result[0]) {
      GetModuleFileName(GetModuleHandle(NULL),Result,MAX_PATH);
      int i;
      for(i=lstrlen(Result)-1;i>0;--i) {
         if('\\'==Result[i-1] || '/'==Result[i-1])
         break;
      }
      Result[i]=0;
   }
   return Result;
}

Прикольно. Плюс, в коде можно менять количество минут захвата.
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 772
Зарегистрирован: 05 июн 2023, 08:32
Железо: Intel Core I5, встройка на 256 мб и 8 гб ОЗУ

CapAvi V2 - Захват видео с Web-камеры

Сообщение rvg » 27 сен 2023, 14:33

CapAvi V2 - Захват видео с Web-камеры.
Программа работает следующим образом:
- если запустить без аргументов, запись по-умолчанию (Семь секунд)
- если указать CapAvi 600 то запись продлится десять минут (естественно сколько вы укажите, десять - это в переводе 600)
- в момент захвата - запись можно отменить, нажав CTRL+F12
 Развернуть: CapAvi.cpp
Код: Выделить всё
// CapAvi.cpp

#pragma comment(lib,"vfw32.lib")
#include <windows.h>
#include <vfw.h>

#define   TIMER_LIMIT   7      /* Время захвата по-умолчанию. */
#define   ID_HOTKEY   0x0CDC31337   /* Горячая клавиша. */

char* GWndname="wnd_capavi"; /* Имя оконного класса. */
char* GAppname="Capture Avi'"; /* Имя приложения. */
UINT wTimeLimit=TIMER_LIMIT; /* Время захвата. Если аргументы не указаны, захват по-умолчанию, в течении семи секунд. */

void mb(char*); /* Сообщение пользователю. */
char* appBaseDir(); /* Получает рабочий каталог. */
DWORD WINAPI ThreadWatcher(LPVOID); /* Информационная триада (поток) работающий независимо. */
char* TimeCalc(int nTotal); /* Вычисляет время из величины введеной пользователем. */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
   char svBuffer[1024];
   char svName[256];
   char svComment[512];
   WORD wDriverIndex=0;

   /* Запуск одной копии. */
   CreateMutex(NULL,0,GAppname);
   BOOL bRet=(GetLastError()==ERROR_ALREADY_EXISTS);
   if(bRet) return 0;

   /* Обнаружение видео-устройств. */
   for(int i=0;i<5;++i) {
      if(capGetDriverDescription(wDriverIndex,svName,255,svComment,512)) {
         wsprintf(svBuffer,"%d: %s %s",wDriverIndex,svName,svComment);
         ++wDriverIndex;
      }
   }

   if(!wDriverIndex)
   mb("Failed - missing video device.");
   --wDriverIndex;

   /* Получение аргументов командной строки. */
   char* svCmdLine=GetCommandLine();
   while(svCmdLine[0]) {
      ++svCmdLine;
      if(' '==(*(svCmdLine-1)))
      break;
   }
   if(svCmdLine[0])
   wTimeLimit=atoi(svCmdLine);

   /* Регистрация комбинации клавиш "Ctrl+F12"
   для отмены захвата. */
   UINT fsModifiers=MOD_CONTROL;
   //UINT fsModifiers=MOD_CONTROL | MOD_ALT;
   UINT vkey=VK_F12;
   if(!RegisterHotKey(NULL,ID_HOTKEY,fsModifiers,vkey))
   mb("Failed RegisterHotKey");

   WNDCLASSEX wcex={sizeof(WNDCLASSEX),0,DefWindowProc,
   0,0,hInstance,NULL,NULL,NULL,NULL,GWndname,NULL,};

   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom)
      mb("Failed register class");
   }

   HWND hWnd=CreateWindowEx(0,MAKEINTATOM(Atom),
   GAppname,0,0,0,0,0,HWND_DESKTOP,NULL,hInstance,NULL);
   if(!hWnd)
   mb("Failed create window");

   /* Создание имя файла захвата состоящего из даты
   и времени включая секунды (в этом уникальность имени). */
   char svDate[128];
   char svTime[128];
   GetDateFormat(LOCALE_SYSTEM_DEFAULT,0,NULL,"ddMMyy",svDate,128);
   GetTimeFormat(LOCALE_SYSTEM_DEFAULT,TIME_FORCE24HOURFORMAT,NULL,"hhmmss",svTime,128);

   char svFilename[MAX_PATH];
   wsprintf(svFilename,"%s%s_%s.avi",appBaseDir(),svDate,svTime);

   char svTimeLimit[128];
   if(svCmdLine[0]) {
      /* Вычислить время указанное пользователем. */
      lstrcpy(svTimeLimit,TimeCalc((int)wTimeLimit));
   }
   else
   wsprintf(svTimeLimit,"%d",TIMER_LIMIT);

   /*-------------------------------------------------------
      Create watcher thread.
   -------------------------------------------------------*/
   char svTimeStart[128];
   GetTimeFormat(LOCALE_SYSTEM_DEFAULT,
   TIME_FORCE24HOURFORMAT,NULL,
   "hh':'mm",
   //"hh'-'mm'-'ss",
   svTimeStart,128);

   wsprintf(svBuffer,
   "Capture video...\n"
   "to file %s\n\n"
   "record start %s\n\n"
   "record total %s\n\n"
   "Press \"CTRL+F12\" <Canceled>",
   svFilename,
   svTimeStart,
   svTimeLimit);

   LPVOID lpParameter=reinterpret_cast<LPVOID>(svBuffer);
   DWORD tid;
   HANDLE hThread=CreateThread(NULL,0,ThreadWatcher,lpParameter,0,&tid);
   if(!hThread) mb("Failed create thread");
   CloseHandle(hThread);

   HWND hwndCap=capCreateCaptureWindow("wnd_cap",WS_CHILD,0,0,160,120,hWnd,1);
   if(!hwndCap)
   mb("Failed capCreateCaptureWindow");

   if(!capDriverConnect(hwndCap,wDriverIndex)) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - unable to connect to driver #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   CAPDRIVERCAPS pcdc;
   capDriverGetCaps(hwndCap,&pcdc,sizeof(CAPDRIVERCAPS));
   if(!pcdc.fCaptureInitialized) {
      DestroyWindow(hwndCap);
      wsprintf(svBuffer,"Failed - driver was not initialized for device #%d",wDriverIndex);
      mb(svBuffer);
   }
   
   DWORD dwSize=capGetVideoFormatSize(hwndCap);
   BITMAPINFO* pbiOrig=(BITMAPINFO*)malloc(dwSize);
   if(!pbiOrig) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error.");
   }

   BITMAPINFO* pbiInfo=(BITMAPINFO*)malloc(dwSize);
   if(!pbiInfo) {
      DestroyWindow(hwndCap);
      mb("Failed - memory allocation error (#2).");
   }

   capGetVideoFormat(hwndCap,pbiOrig,dwSize);
   memcpy(pbiInfo,pbiOrig,dwSize);

   DWORD dwBPP=16;
   DWORD dwFPS=15;
   DWORD dwWidth=160;
   DWORD dwHeight=120;

   pbiInfo->bmiHeader.biWidth=dwWidth;
   pbiInfo->bmiHeader.biHeight=dwHeight;
   pbiInfo->bmiHeader.biBitCount=(WORD)dwBPP;

   pbiInfo->bmiHeader.biPlanes=1;
   pbiInfo->bmiHeader.biClrUsed=0;
   pbiInfo->bmiHeader.biSizeImage=0;
   pbiInfo->bmiHeader.biClrImportant=0;
   pbiInfo->bmiHeader.biCompression=BI_RGB;
   
   pbiInfo->bmiColors->rgbRed=0;
   pbiInfo->bmiColors->rgbBlue=0;
   pbiInfo->bmiColors->rgbGreen=0;
   pbiInfo->bmiColors->rgbReserved=0;

   CAPTUREPARMS capparms;
   capSetVideoFormat(hwndCap,pbiInfo,dwSize);

   capCaptureGetSetup(hwndCap,&capparms,
   sizeof(CAPTUREPARMS));

   capparms.vKeyAbort=MOD_CONTROL | VK_F12;
   capparms.wTimeLimit=wTimeLimit;
   capparms.fLimitEnabled=TRUE;
   capparms.fAbortLeftMouse=FALSE;
   capparms.fAbortRightMouse=FALSE;
   capparms.fMakeUserHitOKToCapture=FALSE;
   capparms.dwRequestMicroSecPerFrame=(1000000/dwFPS);

   capCaptureSetSetup(hwndCap,&capparms,sizeof(CAPTUREPARMS));
   capFileSetCaptureFile(hwndCap,svFilename);
   capCaptureSequence(hwndCap);
   capSetVideoFormat(hwndCap,pbiOrig,dwSize);
   capDriverDisconnect(hwndCap);
   DestroyWindow(hwndCap);

   /* Закрыть триаду (информационное сообщение).
    Найти с помощью функции FindWindow и с помощью
   PostMessage - при этом найдя единственную кнопку
   с помощью GetTopWindow, отправить сообщение о
   как-бы нажатии кнопки OK (BM_CLICK).
   Стоит заметить - этот трюк проходит не всегда.
   Например в Windows XP, Seven - работает, в следующих
   мне неизвестно. */
   HWND hwnd=FindWindow("#32770",GAppname);
   if(hwnd) PostMessage(GetTopWindow(hwnd),BM_CLICK,0,0);

   wsprintf(svBuffer,
   "Video record successful.\n\n"
   "Play videos?\n%s",
   svFilename);
   if(IDYES==MessageBox(hWnd,svBuffer,GAppname,
   MB_YESNO | MB_ICONQUESTION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL))
   ShellExecute(0,"open",svFilename,NULL,NULL,SW_SHOWNORMAL);

   /* Снять регистрацию горячих клавиш. */
   UnregisterHotKey(hWnd,ID_HOTKEY);

   return 0;
}

void mb(char* Str)
{
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(Str,"Failed") || strstr(Str,"Error"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),Str,GAppname,uType);
   if(n)
   ExitProcess(n);
}

char* appBaseDir()
{
   static char Result[MAX_PATH];
   if(!Result[0]) {
      GetModuleFileName(GetModuleHandle(NULL),Result,MAX_PATH);
      int i;
      for(i=lstrlen(Result)-1;i>0;--i) {
         if('\\'==Result[i-1] || '/'==Result[i-1])
         break;
      }
      Result[i]=0;
   }
   return Result;
}

DWORD WINAPI ThreadWatcher(LPVOID parm)
{
   char* svMsg=reinterpret_cast<char*>(parm);
   mb(svMsg);
   return 0;
}

char* TimeCalc(int nTotal)
{
   static char svBuff[64];
   int minutes=nTotal / 60;
   int seconds=nTotal % 60;
   int hours=minutes / 60;
   minutes=minutes % 60;
   if(!hours) {
      if(!minutes)
      wsprintf(svBuff,"%d secs",seconds);
      else
      wsprintf(svBuff,"%02d:%02d",minutes,seconds);
   }
   else
   wsprintf(svBuff,"%2d:%02d:%02d",hours,minutes,seconds);
   return svBuff;
}
Вложения
CapAvi_V2.zip
(17.15 Кб) Скачиваний: 451
CapAvi_V2.jpg
CapAvi_V2.jpg (77.77 Кб) Просмотров: 11755
Последний раз редактировалось rvg 27 сен 2023, 15:31, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Программа Таймер - простой отсчет времени

Сообщение rvg » 27 сен 2023, 19:19

Программа Таймер - простой отсчет времени.
- стрелка Вправо-> увеличить размер цифр
- стрелка <-Влево - уменьшить размер цифр
- клавиша R (cброс)
- клавиша Space (пробел) и кнопка Pause - пауза
- клавиша B изменить цвет фона

Программу можно собрать с помощью Borland C++ и Visual Studio.
 Развернуть: Timer.cpp
Код: Выделить всё
// WinMain.cpp
#include <windows.h>
#include "resource.h"

#define   TIMER_ID   2023
#define   TIMER_DELAY   1000

#define   WINDOW_WIDTH   640
#define   WINDOW_HEIGHT   400
#define   MIN_WINDOW_WIDTH (WINDOW_WIDTH-10)
#define   MIN_WINDOW_HEIGHT (WINDOW_HEIGHT-10)

char* GWndname="wnd_timer'";
char* GAppname="Timer'";

UINT g_nTimer;
int g_nCount, g_nPause;
int g_nHeight=236;
BOOL bTextCenter=1;
char GStr1[64];
HBRUSH GBrush;
COLORREF g_clrPalette=0xFFFFFF;

char* TimeCalc(int nTotal);
void mb(char* Str);
HBRUSH appCreateColor(COLORREF clrCurrent);
COLORREF appChooseColor(HWND hWnd, COLORREF clrCurrent);

void OnTimer(HWND hWnd, WPARAM wParam)
{
   if(TIMER_ID==wParam)
   {
      if(!g_nPause)
      {
         ++g_nCount;
         wsprintf(GStr1,"%s",TimeCalc(g_nCount));
         SetWindowText(hWnd,GStr1);
         InvalidateRect(hWnd,NULL,TRUE);
      }
   }
}

void OnPaint(HWND hWnd)
{
   PAINTSTRUCT ps;
   HDC hDC=BeginPaint(hWnd,&ps);
   RECT rect;
   GetClientRect(hWnd,&rect);

   static LOGFONT Logfont;
   Logfont.lfHeight=g_nHeight;
   Logfont.lfWeight=FW_NORMAL;
   lstrcpy(Logfont.lfFaceName,"Tahoma");

   HFONT oldFont;
   HFONT Font=CreateFontIndirect(&Logfont);
   if(Font) oldFont=static_cast<HFONT>(SelectObject(hDC,Font));

   SetTextColor(hDC,RGB(255,0,0)); /* Color Red */
   SetBkColor(hDC,g_clrPalette);

   if(bTextCenter) {
      rect.left+=(rect.right/4);
      rect.left-=140;
      rect.top+=(rect.bottom/4);
      rect.top -=30;
   } else {
      rect.left=10;
      rect.top=10;
   }

   DrawText(hDC,GStr1,-1,&rect,
   DT_NOPREFIX | DT_WORDBREAK | DT_EXTERNALLEADING);

   if(Font) {
      SelectObject(hDC,oldFont);
      DeleteObject(Font);
   }

   EndPaint(hWnd,&ps);
}

char* TimeCalc(int nTotal)
{
   static char Buffer[64];
   int minutes = nTotal / 60;
   int seconds = nTotal % 60;
   int hours = minutes / 60;
   minutes = minutes % 60;
   if(!hours) {
      if(!minutes)
      wsprintf(Buffer,"%02d",seconds);
      else
      wsprintf(Buffer,"%02d:%02d",minutes,seconds);
   }
   else
   wsprintf(Buffer,"%2d:%02d:%02d",hours,minutes,seconds);
   return Buffer;
}

BOOL OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   HWND hWnd=lpCreateStruct->hwndParent;

   /* Set the timer for one-second intervals. */
   g_nTimer=SetTimer(hWnd,TIMER_ID,TIMER_DELAY,NULL);
   if(!g_nTimer) mb("Failed set timer");
   return 0;
}

BOOL OnCommand(HWND hWnd, WPARAM wParam, LPARAM)
{
   // Item, control or accelerator identifier
   int nID=LOWORD(wParam);

   switch(nID)
   {
   case IDM_EXIT:
   SendMessage(hWnd,WM_DESTROY,0,0);
   }
   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd,
   UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   LPCREATESTRUCT lpCreateStruct;

   switch(uMsg)
   {

   case WM_CREATE:
   {
      lpCreateStruct=reinterpret_cast
      <LPCREATESTRUCT>(lParam);
      lpCreateStruct->hwndParent=hWnd;
   }
   return OnCreate(lpCreateStruct);

   case WM_PAINT:
   OnPaint(hWnd);
   break;

   case WM_ERASEBKGND:
   {
      RECT rect;
      GetClientRect(hWnd,&rect);
      FillRect((HDC)wParam,&rect,GBrush);
   } // End "WM_ERASEBKGND"
   break;

   case WM_TIMER:
   OnTimer(hWnd,wParam);
   break;

   case WM_GETMINMAXINFO:
   {
   LPMINMAXINFO lpInfo=(LPMINMAXINFO)lParam;
   if(lpInfo) {
      lpInfo->ptMinTrackSize.x=MIN_WINDOW_WIDTH;
      lpInfo->ptMinTrackSize.y=MIN_WINDOW_HEIGHT;
   }

   } // End "WM_GETMINMAXINFO"
   break;

   case WM_COMMAND:
   return OnCommand(hWnd,wParam,lParam);

   case WM_KEYDOWN:

   if(VK_DELETE==wParam || 'R'==wParam)
   g_nCount=0;

   if(VK_PAUSE==wParam || VK_SPACE==wParam)
   g_nPause=!g_nPause;

   if(VK_UP==wParam || VK_RIGHT==wParam)
   {
      if(g_nHeight>=400)
      g_nHeight=380;
      g_nHeight+=20;
   }

   if(VK_DOWN==wParam || VK_LEFT==wParam)
   {
      if(g_nHeight<=20)
      g_nHeight=40;
      g_nHeight-=5;
   }

   /* Change color */
   if('B'==wParam)
   {
      COLORREF clrCurrent;
      clrCurrent=g_clrPalette;
      g_clrPalette=appChooseColor(hWnd,clrCurrent);

      /* Set Window color background */
      GBrush=appCreateColor(g_clrPalette);
   }

   break;

   case WM_CLOSE:
   DestroyWindow(hWnd);
   break;

   case WM_QUIT:
   case WM_DESTROY:
   if(g_nTimer) {
      KillTimer(hWnd,g_nTimer);
      g_nTimer=NULL;
   }
   PostQuitMessage(0);
   break;

   default:
   return DefWindowProc(hWnd,uMsg,wParam,lParam);

   } // End "uMsg"

   return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
   GBrush=appCreateColor(g_clrPalette);

   WNDCLASSEX wcex={sizeof(WNDCLASSEX),
   CS_VREDRAW | CS_HREDRAW,WndProc,0,0,
   hInstance,LoadIcon(hInstance,
   MAKEINTRESOURCE(IDR_MAINFRAME)),
   LoadCursor(NULL,IDC_ARROW),
   GBrush,
   NULL,GWndname,NULL,};

   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom) mb("Cannot register class");
   }

   /* Style default */
   DWORD dwExStyle=WS_EX_WINDOWEDGE;//WS_EX_CLIENTEDGE
   DWORD dwStyle=WS_OVERLAPPEDWINDOW;

   int nWidth=WINDOW_WIDTH;
   int nHeight=WINDOW_HEIGHT;

   HWND hWnd=CreateWindowEx(dwExStyle,MAKEINTATOM(Atom),
   GAppname,dwStyle,
   ((GetSystemMetrics(SM_CXSCREEN)-nWidth)/2),
   ((GetSystemMetrics(SM_CYSCREEN)-nHeight)/2),
   nWidth,nHeight,HWND_DESKTOP,
   NULL,hInstance,NULL);
   if(!hWnd) mb("Cannot create window");
   
   ShowWindow(hWnd,nCmdShow);
   UpdateWindow(hWnd);

   MSG msg;
   while(GetMessage(&msg,NULL,0,0)>0) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return (int)msg.wParam;
}

void mb(char* Str)
{
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(Str,"Failed") || strstr(Str,"Cannot"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),Str,GAppname,uType);

   if(n)
   ExitProcess(n);
}

HBRUSH appCreateColor(COLORREF clrCurrent)
{
   LOGBRUSH lplb;
   lplb.lbStyle=BS_SOLID;
   lplb.lbColor=clrCurrent;
   lplb.lbHatch=HS_BDIAGONAL;
   HBRUSH Brush=CreateBrushIndirect(&lplb);
   if(!Brush)
   Brush=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
   return Brush;
}

COLORREF appChooseColor(HWND hWnd, COLORREF clrCurrent)
{
   static COLORREF clrCustom[16];
   static COLORREF clrResult=clrCurrent;
   CHOOSECOLOR cc;
   ZeroMemory(&cc,sizeof(CHOOSECOLOR));
   cc.lStructSize=sizeof(CHOOSECOLOR);
   cc.Flags=CC_RGBINIT | CC_FULLOPEN;
   cc.rgbResult=clrCurrent;
   cc.hwndOwner=hWnd;
   cc.lpCustColors=(LPDWORD)clrCustom;
   cc.lpTemplateName=NULL;
   if(ChooseColor(&cc))
   clrResult=cc.rgbResult;
   InvalidateRect(hWnd,NULL,TRUE);
   return clrResult;
}
Вложения
Timer1.jpg
Timer1.jpg (23.24 Кб) Просмотров: 11519
Timer.zip
(19.29 Кб) Скачиваний: 451
Последний раз редактировалось rvg 30 сен 2023, 08:24, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение krotan » 28 сен 2023, 11:23

rvg писал(а):Программа Таймер - простой отсчет времени.
Переделать в скринсейвер - и будет хоть какая-то польза от неё...
Аватара пользователя
krotan
Мастер Даунгрейда
 
Сообщения: 215
Зарегистрирован: 03 фев 2022, 20:16

Re: Полезные исходники для Windows

Сообщение rvg » 30 сен 2023, 11:42

krotan писал(а):Переделать в скринсейвер - и будет хоть какая-то польза от неё...

Пусть делают. Мне нужно было из окна из дома напротив смотреть вот и сделал.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение krotan » 30 сен 2023, 11:56

rvg писал(а):Пусть делают. Мне нужно было...
Это общая болезнь всех любительских программ, Все думают только о себе любимом...
Аватара пользователя
krotan
Мастер Даунгрейда
 
Сообщения: 215
Зарегистрирован: 03 фев 2022, 20:16

Re: Полезные исходники для Windows

Сообщение rvg » 30 сен 2023, 12:03

krotan писал(а):Это общая болезнь всех любительских программ, Все думают только о себе любимом...

Прошу сюда, пожалуйста.
Последний раз редактировалось rvg 30 сен 2023, 12:44, всего редактировалось 3 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 571
Зарегистрирован: 18 июл 2023, 14:12

Пред.След.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1