【发布时间】:2018-05-30 16:40:06
【问题描述】:
我有一个使用 OpenCV 显示视频的 Windows 窗体应用程序。当我调用这个 OpenCV 调用时,会创建视频显示窗口
CvInvoke.Imshow(winname, frame);
frame 是单帧视频。
调用没有返回任何内容,所以我不知道调用创建的 Window 的句柄。我所知道的是窗口的标题。我发现这段代码可以找到窗口的句柄:
private IntPtr FindWinHandle(string winName)
{
IntPtr hWnd = IntPtr.Zero;
foreach (Process pList in Process.GetProcesses())
{
if (pList.MainWindowTitle.Contains(winName))
{
hWnd = pList.MainWindowHandle;
}
}
return hWnd; //Should contain the handle but may be zero if the title doesn't match
那么问题是.....我如何使用这个 IntPtr 来查找尝试使用“X”按钮关闭窗口的时间??
目前,按下 X 会关闭窗口,但在显示下一帧视频时会立即弹回。由于下一次Imshow 调用,它显示窗口正在关闭窗口但没有“保持关闭”。
这个函数确实适用于我的代码,我能够找到与我的窗口对应的 IntPtr。但是,它需要 > 500 毫秒,这会影响我的视频同步。我打不起这么长时间的电话。
我认为需要一种完全不同的方法。 OpenCV 不会在任何地方公开此信息??
【问题讨论】:
-
我认为您将不得不求助于全局鼠标事件挂钩来拦截所有鼠标点击,并查看它们是否在您想要的窗口/控件上方。这里有一些资源:-experts-exchange.com/questions/26913842/…-c-sharpcorner.com/UploadFile/SamTomato/…
-
抱歉,我没有时间模拟完整的解决方案,但如果您最终解决了问题,请务必回来回答您自己的问题!
-
顺便说一句,我的应用程序确实拥有该窗口。只是 OpenCV 代表我创建并管理它。我假设一旦我拿到手柄等,我就可以操纵它。