Как убить окно? - PullRequest
       18

Как убить окно?

2 голосов
/ 26 апреля 2011

Когда я щелкаю по элементу панели инструментов ESRI COM, он порождает окно - оно выглядит как Winform.Поскольку я не вызывал окно напрямую, я не могу просто выполнить Object.Close () для него.Какую технику я могу использовать для удаления окна, созданного моим приложением, но у меня нет ссылки на объект?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Я думаю, что самый простой способ - использовать 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 ().

Надеюсь, это поможет!

Удачи!

приписка

Просто чтобы ДЕЙСТВИТЕЛЬНО быть уверенным, что вы случайно не убили окно другого приложения (если вы используете FindWindow или FindWindowEx без родителя), вы можете использовать GetWindowThreadProcessId (), чтобы убедиться, что окно принадлежит вашему процессу!

2 голосов
/ 26 апреля 2011

Предполагая, что у вас нет дескриптора окна, вы можете взаимодействовать с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...