Активация формы по заголовку создает исключение 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
сделать это. Этот ТАК вопрос выглядит довольно похоже на то, что вам нужно. Посмотрите на принятое решение.