Активация формы по заголовку создает исключение System.NullReferenceException

Поэтому у меня есть форма с ComboBox что я заполняю список открытых процессов (в этом случае я ограничиваю его процессами с заголовками, которые имеют 13 символов.) Когда я выбираю Item в ComboBox Я хочу найти это Form по названию и BringToFront Однако, когда я делаю это, он бросает System.NullReferenceException,

Вот код, который я использую для заполнения поля.

using HWND = IntPtr;
public static class OpenWindowGetter
{
    /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary>
    /// <returns>A dictionary that contains the handle and title of all the open windows.</returns>
    public static IDictionary<HWND, string> GetOpenWindows()
    {
        HWND shellWindow = GetShellWindow();
        Dictionary<HWND, string> windows = new Dictionary<HWND, string>();

        EnumWindows(delegate (HWND hWnd, int lParam)
        {
            if (hWnd == shellWindow) return true;
            if (!IsWindowVisible(hWnd)) return true;

            int length = GetWindowTextLength(hWnd);
            if (length == 0) return true;

            StringBuilder builder = new StringBuilder(length);
            GetWindowText(hWnd, builder, length + 1);

            windows[hWnd] = builder.ToString();
            return true;

        }, 0);

        return windows;
    }

    private delegate bool EnumWindowsProc(HWND hWnd, int lParam);

    [DllImport("USER32.DLL")]
    private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);

    [DllImport("USER32.DLL")]
    private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount);

    [DllImport("USER32.DLL")]
    private static extern int GetWindowTextLength(HWND hWnd);

    [DllImport("USER32.DLL")]
    private static extern bool IsWindowVisible(HWND hWnd);

    [DllImport("USER32.DLL")]
    private static extern IntPtr GetShellWindow();
}

public void populateIncidents()
    {
        foreach (KeyValuePair<IntPtr, string> window in OpenWindowGetter.GetOpenWindows())
        {
            IntPtr handle = window.Key;
            string title = window.Value;
            if (title.Length == 13)
            {
                chooseIncidentBox.Items.Add(title);
            }
        }
    }

И вот код, который я использую, чтобы попытаться показать форму.

private void chooseIncidentBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        sSelectedIncident = chooseIncidentBox.Text;
        Application.OpenForms[sSelectedIncident].BringToFront(); //Exception thrown here.
    }

Я не совсем уверен, почему это вызывает исключение, я знаю, что Форма существует, поскольку она не заполнила бы ComboBox иначе. Любая помощь будет принята с благодарностью.

1 ответ

Решение

Код, который вы имеете, дает все активные окна. Сейчас, Application.OpenForms работает только на формах, которые открыты в вашем приложении. Например, если у вас есть ParentForm а также ChildFormв вашем приложении, и оба открыты, OpenForms Коллекция будет содержать эти два.

То, что вы ищете, - это перенести любое окно процесса вперед. Вы можете использовать SetForegroundWindow в User32.dll сделать это. Этот ТАК вопрос выглядит довольно похоже на то, что вам нужно. Посмотрите на принятое решение.

Другие вопросы по тегам