私はこれについてすでにいくつかのスレッドがあることを知っています. 私が必要とするのは、メモ帳またはプログラムをクリックすると、ウィンドウフォームのテキストボックスにデータが入力されず、ウィンドウフォームのテキストボックスにのみデータが入力される場合に、ウィンドウフォームウィンドウを常にフォーカスすることです。
私はこのコードがいくらか機能することを発見しました
//Delegates for safe multi-threading.
delegate void DelegateGetFocus();
private DelegateGetFocus m_getFocus;
Thread newThread;
public MemberLogin()
{
m_getFocus = new DelegateGetFocus(this.getFocus);
InitializeComponent();
spawnThread(keepFocus);
toggleFocusButton.Text = "OFF";
timer1.Interval = 2000;
textBox1.Select();
}
//test focus stuff
//Spawns a new Thread.
private void spawnThread(ThreadStart ts)
{
try
{
newThread = new Thread(ts);
newThread.Start();
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Exception!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
//Continuously call getFocus.
private void keepFocus()
{
while (true)
{
getFocus();
}
}
//Keeps Form on top and gives focus.
private void getFocus()
{
//If we need to invoke this call from another thread.
if (this.InvokeRequired)
{
this.Invoke(m_getFocus, new object[] { });
}
//Otherwise, we're safe.
else
{
//having this seemed to have kept my windows onTop at all times even when off
// this.TopMost = true;
this.TopMost = true;
this.Activate();
this.textBox1.Select();
this.textBox1.Focus();
}
}
このコードは、プロジェクトが開いている場合にのみうまく機能するようです。つまり、Visual Studio プロジェクトが閉じている場合、ウィンドウは一番上にありますが、他のプログラム内で入力できるという意味でフォーカスがありません。私が見つけた奇妙なことは、メモ帳とテキストボックスの両方に、テキストを書く場所を示す点滅する行があることです。Visual Studio プロジェクトからアプリを実行すると、すべて正常に動作し、他のウィンドウをクリックしようとすると、必要なものにアクセスできません。
そのため、プロジェクトを開いたときにのみ適切に機能する理由について少し混乱しています
また、プロジェクトが開かれている限り、作成した .exe やその他のコピーも適切に機能し、プロジェクト ソリューションを閉じると、プログラムは上記で説明したことを実行します。
さらにテストを行ったところ、このプロセスが Visual Studio ホスティング プロセスである vhost.exe を実行している場合にのみ正しく機能するようです。設定で無効にしました。VSから起動すると正常に動作しますが、binフォルダーでexeだけを実行すると、奇妙な結果が得られます
編集
これは、私の結果で作成した簡単なビデオですhttp://www.youtube.com/watch?v=1ozpHSRGnMo
新しい編集
これを修正するために私がしたことは、これを行うことでアプリをフルスクリーンモードに設定して、ユーザーが最初にこれを閉じずに他のウィンドウをクリックできるようにすることでした
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;