Здравствуйте, программисты. Пишу простую программу захвата с камеры.
При первом запуске программы все проходит замечательно. При втором запуске вылазит окно (см. аттач) и ничего не сохраняется. Если вызывать ф-ю CapFrame() 2 раза подряд, то в первый раз вылазит окно, а потом все нормально захватывается. После перезагрузки все с начала.
Что я делаю неправильно.
И вопрос 2: может имеет смысл делать это же самое через DirectX??? если да, то можно обоснование и рабочий пример.
Забыл указать, что это под Windows 7. Под XP работает всегда нормально.
Пишу так:
Код | int CapFrame() { HMODULE module = NULL; DWORD nArg1 = 0;
// Create capture window (hidden inside invisible parent window) HWND hwnd,hwndCap;
hwnd = CreateWindow(_T("WSCLAS"), _T(""), 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, module, NULL);
if(hwnd==NULL) { wprintf(_T("Could not create parent window.\n")); return 1; }
hwndCap=capCreateCaptureWindow(_T("Window"), WS_CHILD, 0, 0, 160, 120, hwnd, 1); if(hwndCap==NULL) { DestroyWindow(hwnd); wprintf(_T("Could not create capture window.\n")); return 1; }
// Connect to capture driver if(capDriverConnect(hwndCap, nArg1)==FALSE) { DestroyWindow(hwnd); DestroyWindow(hwndCap); wprintf(_T("Unable to connect to driver #%d\n"), nArg1); return 1; }
CAPDRIVERCAPS pcdc; capDriverGetCaps(hwndCap, &pcdc, sizeof(CAPDRIVERCAPS)); if(!pcdc.fCaptureInitialized) { DestroyWindow(hwnd); DestroyWindow(hwndCap); wprintf( _T("Driver was not initialized for device #%d\n"), nArg1); return 1; }
capGrabFrame(hwndCap); capFileSaveDIB(hwndCap, _T("frame.bmp")); capDriverDisconnect(hwndCap); // disconnect from driver
DestroyWindow(hwndCap); DestroyWindow(hwnd);
wprintf(_T("Frame captured to file.\n"));
return 0; }
int RegisterFakeClass() { // Create useless window class WNDCLASS wndclass; wndclass.style = 0; wndclass.lpfnWndProc = DefWindowProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = GetModuleHandle(NULL); wndclass.hIcon = NULL; wndclass.hCursor = NULL; wndclass.hbrBackground = NULL; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = _T("WSCLAS");
RegisterClass(&wndclass);
return 0; }
int _tmain(int argc, _TCHAR* argv[]) { RegisterFakeClass(); CapFrame(); getchar(); return 0; }
|
|