如何杀死一扇窗户

本文关键字:一扇 窗户 何杀死 | 更新日期: 2023-09-27 17:53:40

当我点击ESRI COM工具栏项时,它会生成一个窗口-它看起来像一个Winform。因为我没有直接生成窗口,所以我不能对它执行Object.Close()。我可以使用什么技术来删除我的应用程序生成的窗口,但我没有对象引用?

如何杀死一扇窗户

我认为最简单的方法是使用p/invoke。

最简单的方法:使用FindWindow()函数来获取和HWND该窗口(在c#的IntPtr中,您可以使用NativeWindow类作为包装器- http://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.aspx#Y114)

一旦你有了HWND,你可以使用CloseWindow()来关闭窗口或使用SendMessage(youHWND, WM_CLOSE, IntPtr)向窗口发送消息。0, intptr . 0) (WM_CLOSE = 0x0010).

如果你的窗口有一个父窗口(你可以使用spy++来发现),你可以使用findwindowwex()以更精确的方式找到你的窗口。

希望有帮助!

祝你好运!

注。

只是为了确保你没有意外地杀死另一个应用程序的窗口(如果你使用FindWindow或findwindowwex没有父),你可以使用GetWindowThreadProcessId()来确保窗口属于你的进程!

假设您没有窗口句柄,您可以与Win32互操作并执行以下操作:

在某些方法调用中:

CallBackPtr callback = WindowEnumeration;
EnumWindows(callback, IntPtr.Zero);

然后它将调用以下命令来找到窗口并关闭它,只需替换

使用尽可能具有描述性的窗口标题,以防止关闭不打算关闭的窗口。 <pre class="language-csharp"><code>private bool WindowEnumeration(IntPtr hwnd, IntPtr lParam) { _windowName.Clear(); if (GetWindowText(hwnd, _windowName, _windowName.Capacity) != 0) { if (_windowName.ToString().Contains("<title>")) { PostMessage(window, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } } return true; } </code></pre><p>调用Win32的信息可以在MSDN或pinvoke.net中找到</p>