私はこの質問をする前にgoogleとsoを検索しました。基本的に私はそれにコンパイルされたフォームを持つDLLを持っています。フォームは、情報を画面に表示するために使用されます。最終的には非同期になり、dllで多くのカスタマイズを公開します。今のところ私はちょうどそれが適切に表示したい。私が抱えている問題は、PowerShellセッションでロードすることによってDLLを使用することです。だから私はフォームを表示し、それがトップに来て、フォーカスを持って取得しようとすると、それは他のすべてのアプリケーションを表示する上で問題はありませんが、私の人生はPowershellウィンドウ。私が現在使っているコードを表示してみましょう。私は一度それを把握すればそれの大部分は必要ないと確信しています、これはちょうど私がGoogleで見つけたすべてのものを表しています。C#フォームのフォーカスを強制する
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。
いいえ、スレッディングは問題を処理しました。 @おかあさん、私はそれらの両方を試しました。どちらも(どちらも一緒に)働かなかった。私はスレッディングを使用することに関して何が悪いのか不思議です。私はApplication.Runを使用していないので、まだ問題があります。親スレッドと子スレッドの両方にアクセスできるメディエータクラスを使用しています。そのオブジェクトでは、ReaderWriterLockを使用して、子スレッドが作成するフォームに表示したいメッセージを表す1つのプロパティをロックしています。親はプロパティをロックし、表示する内容を書き込みます。子スレッドはプロパティをロックし、フォーム上のラベルをどのように変更する必要があるのかを読み込みます。私は本当に幸せではないポーリング間隔(デフォルトは500ms)でこれを行う必要がありますが、私はイベントの方法を見つけることができませんでした子供のスレッドは、ポーリングをしている。
あなただけのフォーム内のコントロールのいずれかに焦点を()を呼び出すことができますか? –
ありがとうございました。 @Chadちょうど私がすでに得ていたのと同じ結果で巻き上げられたフォームにコントロールをフォーカスしようとしています。 @Dean、私はあなた自身のスレッドにフォームを分割する必要があなたの方法を使用すると思います。私はある時点でそれをやり遂げることを計画していたので、今から始めてみようと思います。 – EBGreen