【发布时间】:2009-08-14 00:01:54
【问题描述】:
这很棘手,因为我想将结果作为以后处理的标志。如果一个窗口闪烁,用户会觉得很奇怪。
【问题讨论】:
-
哪个平台,根据操作系统、机器类型等不同。
这很棘手,因为我想将结果作为以后处理的标志。如果一个窗口闪烁,用户会觉得很奇怪。
【问题讨论】:
(这不是答案,只是刷新问题并添加一些细节:)
假设您需要使用这样的代码(delphi,但易于理解)打开一个视频捕获驱动程序(网络摄像头):
result:= SendMessage(hCapWnd, WM_CAP_DRIVER_CONNECT, FDriverNo, 0);
它工作正常,除非相机/网络摄像头很忙(由另一个应用程序打开,例如电影制作人)。然后捕获驱动程序突然显示一个“选择视频源”窗口,该窗口阻止了您的应用程序(但不是电影制作者,它会继续录制)。 SendMessage 函数变为模态并且在不需要的窗口关闭之前不会返回。
有没有办法在连接之前检测捕获驱动程序是否正忙于另一个应用程序?
谢谢
【讨论】:
此函数返回您的机器上可用的网络摄像头和扫描仪的数量(с++)。
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;
}
【讨论】:
我想知道是否可以发送广播消息。我的意思是,假设您向系统中的所有窗口发送一条 VFW 信息请求消息。然后,所有实际进行 VFW 处理的窗口都会回答它们的状态信息,您就会知道它们中的哪些在进行视频处理;某种喊叫“有人在这里吗?”
但这看起来像是蛮力,甚至是黑客攻击。可能我会测试它......可能不会。我确信必须有一种更智能的方法来了解视频捕获驱动程序是否正忙于另一个应用程序。
(顺便说一句……有人在吗?)
【讨论】:
我害怕它会发生。
首先我枚举了系统中所有打开的窗口,然后为每个 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*”,它似乎可以始终如一地工作。不幸的是,您需要以管理员身份运行才能禁用/启用设备。无论如何也不是一个适当的修复...... (我的cam的硬件ID是USB\VID_0AC8&PID_3450&MI_00)
【讨论】: