|
|
I need to be able to list webcams that are plugged in. I can use DeviceChange to tell when a webcam is plugged or unplugged and I am then using the function shown below to create a list of all video devices. This works for all "normal" webcam devices since they appear and disappear from the list when I call the function after they are plugged in or unplugged. Unfortunately, I also have an older webcam, Logitech "Quickcam", that is ALWAYS listed regardless of whether it is plugged in or not... That represents a pathological case. I need a way to determine if it is really plugged in WITHOUT disrupting it in case my software is currently using it. I have scoured all 5 device driver and USB books I know of, scoured MSDN, scoured the internet, tried LOTS of code including USBView which ALMOST provides the information but DISPLAYS A DIFFERENT NAME (not the "FriendlyName" I expected!) so I cannot correlate the information. Anyone know of a solution? (I think this is a REALLY tough problem... I will be unavailable for a couple of weeks but I really need to find a solution and will respond as soon as possible...)
VideoDeviceList *CMotionDetectDlg::GetVideoDeviceList()
{
static VideoDeviceList VideoList;
USES_CONVERSION;
UINT uIndex = 0;
HRESULT hr;
BOOL bCheck = FALSE;
//Clear all previous video list entries
for(int i = 0; i < NUMELMS(VideoList.videoMoniker); i++)
{
if(VideoList.videoMoniker[i]){
VideoList.videoMoniker[i]->Release();
VideoList.videoMoniker[i] = NULL;
}
}
VideoList.videoString.RemoveAll();
VideoList.numberOfDevices = 0;
// enumerate all video capture devices
ICreateDevEnum *pCreateDevEnum = 0;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR)
{
MessageBox(NULL, "Error Creating Device Enumerator");
return NULL;
}
IEnumMoniker *pEm = 0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEm, 0);
if(hr != NOERROR)
{
CString message;
message = CString("No Video capture device was found.\r\n\r\n")
+ CString("Please plug in a webcam or other video capture device.");
//MessageBox(message, "Notice");
if(pEm)pEm->Release();
return NULL;
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag=0;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
//VARIANT vardes;
//vardes.vt = VT_BSTR;
//hr = pBag->Read(L"Description", &vardes, NULL);
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR)
{
VideoList.videoString.InsertAt(uIndex, CString(W2T(var.bstrVal)));
SysFreeString(var.bstrVal);
VideoList.numberOfDevices++;
ASSERT(VideoList.videoMoniker[uIndex] == 0);
VideoList.videoMoniker[uIndex] = pM;
pM->AddRef();
}
pBag->Release();
}
pM->Release();
uIndex++;
}
pEm->Release();
return &VideoList;
}
THANKS!
Howard C. Anderson
HTTP://www.astroshow.com
HTTP://www.azcendant.com
|
|
|
|
|
If you try to BindToObject() after verifying the success of BindToStorage()
wouldn't that succeed of fail depending on the presence of the device?
(I could be wrong but I don't think it will disrupt the device if it is
in use) [edit] I can confirm after testing, this does not distrupt a
running device. I can't confirm that BindToObject will fail if the device
is not plugged in; I don't have a device that enumerates if not plugged
in.[/edit]
e.g. ...
<font color=#fbedb5>__</font>hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
<font color=#fbedb5>__</font>if(SUCCEEDED(hr))
<font color=#fbedb5>__</font>{
<font color=#fbedb5>____</font>IBaseFilter *pDevice;
<font color=#fbedb5>____</font>hr = pM->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDevice);
<font color=#fbedb5>____</font>if(SUCCEEDED(hr))
<font color=#fbedb5>____</font>{
<font color=#fbedb5>______</font>pDevice->Release();
<font color=#fbedb5>______</font>...
<font color=#fbedb5>______</font>...
Steve T
-- modified at 13:53 Thursday 20th October, 2005
|
|
|
|
|
Hi,
Finally I have returned... Sorry for delayed response.
I know if I use AddFilter to add to the capture graph, I can tell whether the device is there. However, I think that means I have to disrupt it, i.e., eliminate it from the capture graph and then reconnect it. That would interrupt the video.
I tried your suggestion but it answers S_OK even when the camera is not attached! Like I said, this is a pathological case caused by the method used by this older QuickCam.
It is set up so that you have to use "Unplug or Eject Hardware" to make the driver go away. Newer systems handle this automatically. Wonder if I can figure out what the "Unplug or Eject Hardware" function is doing? If I could, then maybe I could use that to determine the status.
I will continue looking at functions that might be used to determine status. Your idea gave me some other ideas to try...
Thanks,
Howard
Howard C. Anderson
HTTP://www.astroshow.com
|
|
|
|
|
Hi,
I am new to MFC. I am trying to invoke a dialog from
the menu.
I read the menus for beginners.
http://www.codeproject.com/menu/MenusForBeginners.asp
But I still a bit confused.
Here is what I did.
I already created a dialog, ID: IDD_MY_DIALOG.
I also created a menu item and added event_handler
with Message type: COMMAND, Class list: CMainFrame,
ID: ID_MY_DIALOG.
So, the Wizard created a default method for me
void CMainFrame::OnMy_Dialog()
{
// TODO: Add your command handler code here
}
But I don't how to invoke my dialog when
user clicked the "My_Dialog" menu item.
Any help would be appreciated?
Thanks,
Kevin
|
|
|
|
|
When you created the dialog, you will have been prompted to create a wrapper class for it, e.g. CMyNewDialog.
To pop one of these dialogs up you would do:
CMyNewDialog dlgBox; // object is not a window until you call DoModal etc
dlgBox.DoModal();
This would show the dialog on the screen
If you vote me down, my score will only get lower
|
|
|
|
|
Hi Roger,
> When you created the dialog, you will have been prompted to
> create a wrapper class for it, e.g. CMyNewDialog.
When I right-mouse-clicked, it just pops up a default dialog.
It did not prompted me to create a wrapper class.
Can you tell me how to do so?
>To pop one of these dialogs up you would do:
>CMyNewDialog dlgBox; // object is not a window until you call DoModal etc
>dlgBox.DoModal();
Oh yeah! I remember I read this from some books before.
Really appreciated your help.
Thanks,
Kevin
|
|
|
|
|
I think I found the answer.
1) Open up the resource view.
2) click the dialog ID.
3) right click the dialog to add class.
|
|
|
|
|
I have a CBitmap derrived class, and have my own Draw function. However, When it is displayed, it its overlapped by other controls. Is there a way to make a CBitmap on top of all controls?
thanks..
|
|
|
|
|
Set the z-order of the button properly in the dialog design window
-prakash
|
|
|
|
|
Hello Prakash,
I have declared CBitmap in this,
CMyBitmap mybitmap;
mybitmap.LoadBitmap(IDB_MYBMP);
mybitmap.DrawTransparent(GetDC(),20,50,RGB(255,0,255));
Sorry I was not clear enough in the first place. CMyBitmap is derrived from CBitmap, I have to subclass because i need to make the bitmap transparent. Please help me How I could bring this on top of other controls. Anyway here is the detail of DrawTransparentFunction.(Just research this detail from other articles but it didnt bring the bitmap on top. Its weakness is when there are other control because it is overlapped.)
void CMyBitmap::DrawTransparent(CDC *pDC, int x, int y, COLORREF clrTransparency)
{
BITMAP bm;
GetBitmap (&bm);
CPoint size (bm.bmWidth, bm.bmHeight);
pDC->DPtoLP (&size);
CPoint org (0, 0);
pDC->DPtoLP (&org);
//
// Create a memory DC (dcImage) and select the bitmap into it.
//
CDC dcImage;
dcImage.CreateCompatibleDC (pDC);
CBitmap* pOldBitmapImage = dcImage.SelectObject (this);
//dcImage.SetMapMode (pDC->GetMapMode ());
//
// Create a second memory DC (dcAnd) and in it create an AND mask.
//
CDC dcAnd;
dcAnd.CreateCompatibleDC (pDC);
//dcAnd.SetMapMode (pDC->GetMapMode ());
CBitmap bitmapAnd;
bitmapAnd.CreateBitmap (bm.bmWidth, bm.bmHeight, 1, 1, NULL);
CBitmap* pOldBitmapAnd = dcAnd.SelectObject (&bitmapAnd);
dcImage.SetBkColor (clrTransparency);
dcAnd.BitBlt (org.x, org.y, size.x, size.y, &dcImage, org.x, org.y, SRCCOPY);
//
// Create a third memory DC (dcXor) and in it create an XOR mask.
//
CDC dcXor;
dcXor.CreateCompatibleDC (pDC);
//dcXor.SetMapMode (pDC->GetMapMode ());
CBitmap bitmapXor;
bitmapXor.CreateCompatibleBitmap (&dcImage, bm.bmWidth, bm.bmHeight);
CBitmap* pOldBitmapXor = dcXor.SelectObject (&bitmapXor);
dcXor.BitBlt (org.x, org.y, size.x, size.y, &dcImage, org.x, org.y, SRCCOPY);
dcXor.BitBlt (org.x, org.y, size.x, size.y, &dcAnd, org.x, org.y, 0x220326);
//
// Copy the pixels in the destination rectangle to a temporary
// memory DC (dcTemp).
//
CDC dcTemp;
dcTemp.CreateCompatibleDC (pDC);
//dcTemp.SetMapMode (pDC->GetMapMode ());
CBitmap bitmapTemp;
bitmapTemp.CreateCompatibleBitmap (&dcImage, bm.bmWidth, bm.bmHeight);
CBitmap* pOldBitmapTemp = dcTemp.SelectObject (&bitmapTemp);
dcTemp.BitBlt (org.x, org.y, size.x, size.y, pDC, x, y, SRCCOPY);
//
// Generate the final image by applying the AND and XOR masks to
// the image in the temporary memory DC.
//
dcTemp.BitBlt (org.x, org.y, size.x, size.y, &dcAnd, org.x, org.y, SRCAND);
dcTemp.BitBlt (org.x, org.y, size.x, size.y, &dcXor, org.x, org.y, SRCINVERT);
//
// Blit the resulting image to the screen.
//
pDC->BitBlt (x, y, size.x, size.y, &dcTemp, org.x, org.y, SRCCOPY);
//
// Restore the default bitmaps.
//
dcTemp.SelectObject (pOldBitmapTemp);
dcXor.SelectObject (pOldBitmapXor);
dcAnd.SelectObject (pOldBitmapAnd);
dcImage.SelectObject (pOldBitmapImage);
}
|
|
|
|
|
I dont think it is a problem with your drawing, The problem is probably with the placement of the controls.
If the controls are overlaping that means, you have placed them like that.
or is the bitmap drawing beyond your required place.
or if you want the bitmap to be drawn over other contorls, consider making thouse contorls invisible.
-prakash
|
|
|
|
|
Hello,
Can somebody help me. I have a CBitmapButton and I want to hide parts or area with magenta color RGB(255,0,255). I think I have to create a class that derrives CBitmapButton some functions.. But am not familiar with graphics in EVC. Please help me how to do it.
Thanks and Good day..
|
|
|
|
|
here is an strange problem.
i included a header file <dbt.h>
Now i used some of the structures defined in it.
when i right click on structure name and click goto definition it take me to dbt.h and show the definition.
but when i build the application it gives error saying undefined refrence for the same structure.
Why is this happening. What is the solution.
Thanks
|
|
|
|
|
is dbt.h made by you?
if yes, can you make sure that there is only one file in your project directory.
I used to have similar problem and figured that it was due to duplicate files.
-prakash
|
|
|
|
|
Hi all
I have searched high and low, but cant find a way to disable linker warnings. Sure compiler warnings can be dealt with in various ways, but I cant find a single option for the linker. I tried passing the linker warning numbers to the compilers option too without luck. Any ideas?
xacc-ide 0.0.99-preview3
|
|
|
|
|
a suggestion,
instead of disableing the linker warnings try to resolve them, usally linker warnings when ignored makes the binary kinda unstable, It would crash without any reason and difficult to debug.
-prakash
|
|
|
|
|
leppie wrote: I tried passing the linker warning numbers to the compilers option too without luck. Any ideas?
what about this
#pragma comment(linker, "/include:__mySymbol")
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
|
I want to exit an application programatically i will use
exit(0);
But some how i feel if i do this with MFC application, its not a good thing.
Can anyone tell me is it a safe way to exit an MFC application.
If any other approach is there plz let me know.
Thanks a lot
|
|
|
|
|
|
One can send WM_CLOSE message to the application
|
|
|
|
|
karmendra_js wrote:
Can anyone tell me is it a safe way to exit an MFC application.
PostQuitMessage(...);
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
Hi
I am using PostgreSQL as my Database. I have derived one Table using CRecordset. I have to use CByteArray to store Images into that table. I am using this way. is there any wrong in my code plz help me.
CCitizenPhoto rs;
rs.AddNew();
rs.m_sno = sno;
CFile f;
f.Open("Photo.jpg",CFile::modeRead);
rs.m_photo.SetSize(f.GetLength());
f.Read(rs.m_photo.GetData(),f.GetLength());
f.Close();
rs.SetFieldDirty(&rs.m_photo);
rs.SetFieldNull(&rs.m_photo,FALSE);
rs.Update();
rs.Close();
when i am running this code it is giving Error as Data Truncated.
I have Initialized MAXSIZE with 36000.
RFX_Binary(pFX,_T("[photo]",m_photo,MAXSIZE);
When i am storing of 10K image it is storing nicely and i am able to retrieve also. But more than 10k it is giving error as Data truncated. it is unable to store and retrive. both places giving error as Data truncated.
Plz help me
Thans in advance.
|
|
|
|
|
Hi! Does anyone know how can i make my application starts when windows starts up, i mean using code not put the application in the startup folder! . I think i must use the registry but i m not sure! Thanks!
------------------------------
If you can't find the
-- -- -- -- -- -- -- -- -- --
way..let the way find you..
------------------------------
|
|
|
|
|