繁体   English   中英

C#Windows Forms App-如何检测非表单窗口关闭

[英]C# Windows Forms App - how to detect non-forms window closing

我有一个Windows窗体应用程序,该应用程序使用OpenCV来显示视频。 当我调用此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可以关闭窗口,但是在显示下一帧视频时会向右弹出。 似乎窗口IS正在关闭窗口,但由于下一个Imshow调用而没有“保持关闭”。

此函数确实适用于我的代码,并且能够找到与我的窗口相对应的IntPtr。 但是,它要花费> 500毫秒,这会导致我的视​​频同步失败。 我承受不起这么长的通话时间。

我认为需要一种完全不同的方法。 OpenCV不会在任何地方公开此信息?

由于您的应用程序确实拥有该窗口,因此您可以只使用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而不是本机的东西找到它?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM