如何杀死一扇窗户
本文关键字:一扇 窗户 何杀死 | 更新日期: 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);
然后它将调用以下命令来找到窗口并关闭它,只需替换
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;
}
调用Win32的信息可以在MSDN或pinvoke.net中找到