したがって、この質問をする前に、グーグルとSOを検索しました。基本的に、フォームがコンパイルされたDLLがあります。フォームは、画面に情報を表示するために使用されます。最終的には非同期になり、dll で多くのカスタマイズが公開されます。とりあえずちゃんと表示してほしい。私が抱えている問題は、Powershell セッションにロードして dll を使用することです。そのため、フォームを表示して一番上に来てフォーカスを取得しようとすると、他のすべてのアプリの上に表示しても問題ありませんが、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 を使用して、子スレッドが作成するフォームに表示するメッセージを表す 1 つのプロパティをロックしています。親はプロパティをロックしてから、表示すべきものを書き込みます。子スレッドはプロパティをロックし、フォームのラベルを何に変更するかを読み取ります。子はポーリング間隔 (デフォルトでは 500 ミリ秒) でこれを行う必要がありますが、これについてはあまり満足していませんが、プロパティが変更されたことを子スレッドに知らせるイベント ドリブンの方法を見つけることができませんでした。