如何杀死一个窗口?

时间:2011-04-26 19:38:11

标签: c# windows winforms com

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

2 个答案:

答案 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的信息