Итак, я выполнил поиск в Google и SO, прежде чем задавать этот вопрос. В основном у меня есть DLL, в которой есть скомпилированная форма. Форма будет использоваться для отображения информации на экране. В конце концов это будет асинхронным и выставить много настроек в DLL. Сейчас я просто хочу, чтобы он отображался правильно. Проблема, которая у меня возникла, заключается в том, что я использую DLL, загружая ее в сеансе Powershell. Поэтому, когда я пытаюсь отобразить форму и заставить ее подняться на вершину и сфокусироваться, у нее нет проблем с отображением поверх всех других приложений, но я не могу на всю жизнь заставить ее отображать поверх окна Powershell , Вот код, который я сейчас использую, чтобы попытаться отобразить его. Я уверен, что большая часть этого не понадобится, как только я это выясню, это просто представляет все то, что я нашел через Google.
CLass Blah
{
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll", EntryPoint = "ShowWindowAsync")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private const int WS_SHOWNORMAL = 1;
public void ShowMessage(string msg)
{
MessageForm msgFrm = new MessageForm();
msgFrm.lblMessage.Text = "FOO";
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.TopMost = true;
msgFrm.Activate();
SystemParametersInfo((uint)0x2001, 0, 0, 0x0002 | 0x0001);
ShowWindowAsync(msgFrm.Handle, WS_SHOWNORMAL);
SetForegroundWindow(msgFrm.Handle);
SystemParametersInfo((uint)0x2001, 200000, 200000, 0x0002 | 0x0001);
}
}
Поскольку я говорю, что я уверен, что большая часть этого либо не нужна, либо даже совершенно неправильная, я просто хотел показать вещи, которые я пробовал. Кроме того, как я уже упоминал, я планирую отображать это асинхронно в какой-то момент, который, как я подозреваю, в конечном итоге потребует отдельного потока. Разве разделение формы на собственный поток облегчит фокусировку на сеансе Powershell?
@ Джоэл, спасибо за информацию. Вот что я попробовал, основываясь на вашем предложении:
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.Focus();
Application.DoEvents();
Форма все еще появляется в сеансе Powershell. Я приступлю к разработке потоков. Я порождал потоки раньше, но никогда там, где родительскому потоку нужно было общаться с дочерним потоком, так что посмотрим, как он пойдет.
Спасибо за все идеи до сих пор люди.
Хорошо, поточность позаботилась о проблеме. @ Quarrelsome, я попробовал оба из них. Ни (ни то и другое вместе) не работало. Мне интересно, что плохого в использовании потоков? Я не использую Application.Run, и у меня еще есть проблема. Я использую класс-посредник, к которому родительский поток и дочерний поток имеют доступ. В этом объекте я использую ReaderWriterLock для блокировки одного свойства, которое представляет сообщение, которое я хочу отобразить в форме, которую создает дочерний поток. Родитель блокирует свойство, затем записывает, что должно отображаться. Дочерний поток блокирует свойство и считывает, на что он должен изменить метку в форме. Ребенок должен делать это в интервале опроса (по умолчанию это 500 мс), что меня не очень радует, но я не смог найти управляемый событиями способ сообщить дочернему потоку, что свойство изменилось, поэтому я ' м застрял с опросом.