【问题标题】:C# Windows Forms App - how to detect non-forms window closingC# Windows Forms App - 如何检测非窗体窗口关闭
【发布时间】: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 代表我创建并管理它。我假设一旦我拿到手柄等,我就可以操纵它。

标签: c# opencv emgucv


【解决方案1】:

由于您的应用程序确实拥有该窗口,您能否只使用Control.FromIntPtr 调用来获取对它的引用,然后订阅 OnClosing 事件?

var control = Control.FromIntPtr(intPtr);
Form form = control as Form;
if (form is null) 
    form = control.FindForm();
form.OnClosing += //your code here

另外,如果您的应用程序拥有该表单,您能否使用 Application.OpenForms 而不是使用本机的东西找到它?

【讨论】:

  • 谢谢!!并感谢 OpenForms 提示!使用我发布的技术搜索窗口需要 500 多毫秒,比我的时间还多。如果这解决了我的问题,将发布。听起来应该!
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2014-04-11
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多