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

标签 c# opencv emgucv

我有一个使用 OpenCV 显示视频的 Windows 窗体应用程序。当我调用这个 OpenCV 调用时创建了视频显示窗口

CvInvoke.Imshow(winname, frame);

frame 是视频的单帧。

调用没有返回任何内容,所以我不知道调用创建的窗口的句柄。我所知道的是窗口的标题。我发现这段代码可以找到窗口的句柄:

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 不会在任何地方公开此信息??

最佳答案

由于您的应用程序确实拥有该窗口,您可以只使用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 而不是使用 native 内容找到它?

关于C# Windows Forms App - 如何检测非窗体窗口关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609709/

相关文章:

c# - 创建 REST 客户端 API

c# - 单例模式困惑

python - 使用 Python 修剪图像中的(噪声)空白

c# - 视频流中的多个QRCode检测

c# - 试图了解C#方法的签名

c# - 如何将对象传递给脚本?

python - cv2需要很长时间才能更新框架

image-processing - 编程相机以选择ROI

python - python cv2 和 C# emgu cv 中的边缘着色

c# - T4 获取枚举成员的值