Итак, я искал 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?
@Joel, спасибо за информацию. Вот что я пробовал на основе вашего предложения:
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.Focus();
Application.DoEvents();
Форма все еще появляется под сессией Powershell. Я приступю к разработке потоков. Я породил потоки раньше, но никогда, где родительский поток должен был поговорить с дочерним потоком, поэтому мы посмотрим, как это происходит.
Thnks для всех идей до сих пор люди.
Хорошо, потокование позаботилось о проблеме. @Quarrelsome, я попробовал оба из них. Ни один (ни один вместе) не работал. Мне любопытно, что такое зло в использовании потоков? Я не использую Application.Run, и у меня еще есть проблема. Я использую класс посредника, к которому имеют доступ как родительский поток, так и дочерний поток. В этом объекте я использую ReaderWriterLock для блокировки одного свойства, которое представляет сообщение, которое я хочу отобразить в форме, созданной дочерним потоком. Родитель блокирует свойство, затем записывает то, что должно отображаться. Детский поток блокирует свойство и читает, что он должен изменить на этикетке в форме. Ребенок должен сделать это на интервале опроса (я по умолчанию его до 500 мс), которого я не очень доволен, но я не мог найти способ, связанный с событиями, чтобы позволить дочернему потоку узнать, что проперти изменилась, m застрял с опросом.