gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:49 26 4
gpt4 key购买 nike

我有一个使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com