当我单击ESRI COM工具栏项时,它会生成一个窗口 - 它看起来像Winform。由于我没有直接生成窗口,我不能只对它做一个Object.Close()。我可以使用什么技术删除我的应用程序生成的窗口,但是我没有对象引用?
答案 0 :(得分:3)
我认为最简单的方法是使用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.Zero,IntPtr.Zero)向窗口发送消息(WM_CLOSE = 0x0010)。
如果你的窗口有一个父窗口(你可以使用spy ++找到它),你可以使用FindWindowEx()以更精确的方式找到你的窗口。
希望它有所帮助!
祝你好运!P.S。
只是为了确保你不会意外地杀死另一个应用程序的窗口(如果你使用FindWindow或没有父项的FindWindowEx)你可以使用GetWindowThreadProcessId()来确保该窗口属于你的进程!
答案 1 :(得分:2)
假设您没有窗口句柄,则可以与Win32互操作并执行以下操作:
在某些方法中调用:
CallBackPtr callback = WindowEnumeration;
EnumWindows(callback, IntPtr.Zero);
然后它将调用以下内容找到窗口并关闭它,只需替换< title>使用描述性的窗口标题,以防止关闭不打算关闭的窗口。
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;
}
可以在MSDN或pinvoke.net
中找到用于调用Win32的信息