Evitar Cuadro de dialogo "Origen de video"

Iniciado por Vaagish, 7 Abril 2014, 22:58 PM

0 Miembros y 2 Visitantes están viendo este tema.

Vaagish

Hola! Estoy con un programa que captura una imagen de la webcam, es aplicación de consola, sobre Win7, uso las funciones capCreateCaptureWindow, capDriverConnect, capDriverDisconnect y SendMessage, la imagen se captura, pero 2*3 me pide que seleccione la cámara de una lista (en la que solo existe una cámara, porque es la única que tengo), si bien ya he buscado por otros lados y di con gente que tiene el mismo problema quisiera saber por que a veces sale y a veces no.. y de ser posible que no salga nunca, porque quema mucho jaja

CODE:
Código (cpp) [Seleccionar]

int GetWebCam()
{
hWnd = GetConsoleWindow();

Captura = capCreateCaptureWindow("handle", WS_CHILD | WS_VISIBLE, 0, 0, 640, 480, hWnd, 1);

if (capDriverConnect(Captura, 0) != 0)
{
EmptyClipboard();
//SendMessage(Captura, WM_CAP_DLG_VIDEOSOURCE, 0, 0);

ShowWindow(Captura, SW_HIDE);

SendMessage(Captura, WM_CAP_SET_PREVIEW, true, 0);
SendMessage(Captura, WM_CAP_GRAB_FRAME, 0, 0);
SendMessage(Captura, WM_CAP_EDIT_COPY, 0, 0);

OpenClipboard(NULL);
HBM = HBITMAP(GetClipboardData(CF_BITMAP));
SaveToFile(HBM, "Imagen.jpg");

capDriverDisconnect(Captura);
return 0;
}


cout << "Error capCreateCaptureWin: " << GetLastError() << endl;
return -1;
}


Saludos!

PD: SendMessage(Captura, WM_CAP_DLG_VIDEOSOURCE, 0, 0) Esta comentado porque si dejo esa linea sale siempre el cuadro...

PD2: Creo que GetLastError no tiene uso en este codigo, pero la deje para no editar el codigo que salga todo torcido.

Eternal Idol

¿Que te podemos decir? El codigo no compila  :silbar: Depuralo con el WinDbg y mira la pila cuando muestre ese dialogo para saber que condicion/es lleva/n a mostrarlo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Bueno,, ta bien.. código completo la próxima,, intento depurarlo.. pero no te suena que sea algo propio de win7?

La MSDN dice que tenemos esta funcion:
Código (cpp) [Seleccionar]

char szDeviceName[80];
char szDeviceVersion[80];

for (wIndex = 0; wIndex < 10; wIndex++)
{
    if (capGetDriverDescription(
            wIndex,
            szDeviceName,
            sizeof (szDeviceName),
            szDeviceVersion,
            sizeof (szDeviceVersion)
        ))
    {
        // Append name to list of installed capture drivers
        // and then let the user select a driver to use.
    }
}


Y que el usuario elija, pero en la practica hay programas que no abren cuadro de dialogo,, así que se tiene que poder..

Saludos!

Eternal Idol

Depura alguno de esos otros programas  ;D Pones un breakpoint en la llamada a capCreateCaptureWindow y te fijas si por ejemplo hWnd es diferente de 0 (por decir algo, jamas use esta API) o si antes de llamarla usa otras APIs para configurar algo ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

#4
Ok,, es un buen lugar por donde empezar.. Tnks!

Saludos! Y si lo logro pongo el code

PD: Una consola que muestra video!!

Código (cpp) [Seleccionar]

#include <Windows.h>
#pragma comment(lib, "Vfw32.lib")
#include <Vfw.h>

int main()
{

HWND hWnd = GetConsoleWindow();
HWND Captura = capCreateCaptureWindow("CaptureWin", WS_CHILD | WS_VISIBLE, 0, 0, 640, 480, hWnd, 1);

if (capDriverConnect(Captura, 0) != 0)
{

SendMessage(Captura, WM_CAP_DLG_VIDEOSOURCE, 0, 0);


while (true){
SendMessage(Captura, WM_CAP_SET_PREVIEW, true, 0);
SendMessage(Captura, WM_CAP_GRAB_FRAME, 0, 0);
SendMessage(Captura, WM_CAP_EDIT_COPY, 0, 0);
}

SendMessage(Captura, WM_CAP_DRIVER_DISCONNECT, 0, 0);

}

return 0;
}


Por lo menos a mi me muestra la captura de la cámara en el programa de consola, al pasarle el hWnd de la ventana.. :p

Eternal Idol

Momento ... ¿Para que mandas ese mensaje?

WM_CAP_DLG_VIDEOSOURCE message

¿Acaso no esta haciendo exactamente lo que le estas pidiendo?  ;D




Remarks
The Video Source dialog box is unique for each capture driver. Some capture drivers might not support a Video Source dialog box. Applications can determine if the capture driver supports this message by checking the fHasDlgVideoSource member of the CAPDRIVERCAPS structure.

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

#6
Haa,, si..  en ese caso sale siempre,, si no lo uso ese mensaje sale cuando quiere el cuadro de dialgo,, ojo.. en realidad no quiero que salga... es que estoy combinando cosas.. jaja

PD: Ahora me colgué haciendo pruebas con las funciones para grabar video, pero voy a probar con Olly a ver cuando se produce el llamado al cuadro de dialogo, porque seguro que yo no lo hago, o no es mi intención jaja y en cuanto lo identifique,, te juro que lo mato..  :xD

Eternal Idol

Mmm me da la impresion de que estas complicado, me sale el dialogo y hay un solo driver "Microsoft WDM Image Capture (Win32)" (capGetDriverDescription solo retorna datos con index 0) y dos dispositivos de video. Antes tenia deshabilitada la webcam, asi que seguramente cuando hay 2 o mas dispositivos de video te muestra el dialogo, capaz necesitas una API de menor nivel (a dispositivo de video y no capturador).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Uff,, ahora estaba intentando con Olly llegar al problema, pero se tranca no se por que.. y WinDbg nunca lo entendí..
En teoría debería tener solo un dispositivo de video, la cámara integrada en la notebook..
Como seria eso de la api de menor nivel?
Comunicarme con el dispositivo directamente y no usar capCreateCaptureWindow?  :¬¬

Eternal Idol

Cita de: Vaagish en  8 Abril 2014, 01:55 AMUff,, ahora estaba intentando con Olly llegar al problema, pero se tranca no se por que.. y WinDbg nunca lo entendí..

Si ejecuto el programa desde WinDbg no funciona bien asi que lo ejecuto normalmente y despues me attacheo con WinDbg.

Cita de: Vaagish en  8 Abril 2014, 01:55 AMEn teoría debería tener solo un dispositivo de video, la cámara integrada en la notebook..

Si ... pero el Cyberlink DVD instalo un splitter en mi notebook  ::) Asi que hay dos, uno virtual y otro fisico.
Cita de: Vaagish en  8 Abril 2014, 01:55 AMComo seria eso de la api de menor nivel?
Comunicarme con el dispositivo directamente y no usar capCreateCaptureWindow?  :¬¬

Me da la impresion que podrias usar DirectShow:
Selecting a Capture Device

Ese codigo me enumero:
CyberLink Webcam Splitter
Device path: \\?\root#media#0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
HP Webcam-50
Device path: \\?\usb#vid_05c8&pid_0223&mi_00#7&1d1c0389&0&0000#{65e8773d-8f56-11
d0-a3b9-00a0c9223196}\global
Internal Mic (IDT High Definiti
WaveIn ID: 0
Headset Mic (IDT High Definitio
WaveIn ID: 2
Stereo Mix (IDT High Definition
WaveIn ID: 1

:silbar:
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón