[英]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.