这很棘手,因为我想将结果作为以后处理的标志。如果窗口闪烁,用户会感到很奇怪。
5 回答
(这不是答案,只是刷新问题并添加一些细节:)
假设您需要使用这样的代码(delphi,但易于理解)打开视频捕获驱动程序(网络摄像头):
result:= SendMessage(hCapWnd, WM_CAP_DRIVER_CONNECT, FDriverNo, 0);
它工作正常,除非相机/网络摄像头很忙(由另一个应用程序打开,例如电影制作人)。然后捕获驱动程序突然显示一个“选择视频源”窗口,该窗口阻止了您的应用程序(但不是电影制作者,它会继续录制)。SendMessage 函数变为模态,直到关闭不需要的窗口才返回。
有没有办法在连接之前检测捕获驱动程序是否正忙于另一个应用程序?
谢谢
此函数返回您的 mashine (с++) 上可用的网络摄像头和扫描仪的数量。
int GetNumCam()
{
int MemberIndex = 0;
HDEVINFO dev;
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
dev = SetupDiGetClassDevsA(&GUID_DEVINTERFACE_IMAGE, NULL,NULL,DIGCF_PRESENT);
if (dev == NULL)
{
MessageBoxA(0,"it is null..","vse propalo",0);
return -1;
}
else
{
while(SetupDiEnumDeviceInfo(dev,MemberIndex, &DeviceInfoData))
{
MemberIndex++;
}
}
return MemberIndex;
}
I wonder if sending a broadcast message could do. I mean, suppose you send a VFW info request message to all windows in system. Then, all windows actually doing VFW processing will answer their status info and you will know which of them are doing video processing; some kind of shouting "anybody here...?"
But it looks like brute force, or even hacking. May be I'll test it... may be not. I am sure there must be a smarter way to know if a video capture driver is busy with another application.
(btw... anybody here?)
我害怕它会发生。
首先我枚举了系统中所有打开的窗口,然后为每个 HWND 执行这条指令,它只询问驱动程序信息(pascal 语法):
SendMessage(h, WM_CAP_DRIVER_GET_NAME, length(driver)*sizeof(char), LPARAM(PChar(driver))
根据Msdn help, WM_CAP_DRIVER_GET_NAME 结果是:
“如果成功则返回 TRUE,如果捕获窗口未连接到捕获驱动程序,则返回 FALSE”
(粗体是我的)。因此,这似乎是一个很好的了解方式:
1-如果窗口正在捕获。所以它适用于所有窗口,不管它们是否正在捕获。
2-如果是这样,它会告诉您正在使用哪个驱动程序。
但是,在第一轮测试之后,结果是:
- 任务管理器(它正在运行)崩溃并关闭
- 资源管理器崩溃并关闭(自动重新打开)
- Belkin 无线监视器(我的电脑的 WiFi 驱动程序)崩溃并关闭
- Eset Nod32 防病毒软件崩溃, 没有关闭
第一个结论可能是,这是定位系统中哪些应用程序正在捕获视频的不好方法。但我必须确保排除错误的可能性。
我会继续报道。
无论如何,这不是一个好的解决方案,但我发现如果您在发送 WM_CAP_DRIVER_CONNECT 消息之前立即在设备管理器中禁用和启用摄像头,那么由于某种原因,视频源窗口不会出现,并且该功能返回并正常工作。因此,对于我正在处理的脚本,我必须下载 devcon.exe,然后在我的 WM_CAP_DRIVER_CONNECT 之前放置“devcon disable *PID_3450*MI_00*”和“devcon enable *PID_3450*MI_00*”,它似乎可以正常工作。不幸的是,您需要以管理员身份运行才能禁用/启用设备。无论如何都不是正确的修复方法......(我的摄像头的硬件 ID 是 USB\VID_0AC8&PID_3450&MI_00)