0

私はこれについてすでにいくつかのスレッドがあることを知っています. 私が必要とするのは、メモ帳またはプログラムをクリックすると、ウィンドウフォームのテキストボックスにデータが入力されず、ウィンドウフォームのテキストボックスにのみデータが入力される場合に、ウィンドウフォームウィンドウを常にフォーカスすることです。

私はこのコードがいくらか機能することを発見しました

    //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;
4

3 に答える 3

5

他のウィンドウがフォーカスを取得するのを防ぐことはできませんが、取得した瞬間にフォーカスを奪うことができます;)

private void timer1_Tick(object sender, EventArgs e)
{
    if (!this.Focused)
    {
        this.Activate();
    }
}

タイマーを作成し、最初から有効にし、ティック間隔を必要なだけ小さくして、上記のコードを tick-event として配置するだけです。

お役に立てれば

下手な英語で泣く

于 2013-04-07T17:10:08.580 に答える
1

あなたのコードは問題ないようで、あなたが望むように動作するはずです、あなたは次のURLで提案されている何かを試すことができます...しかし、

this.TopMost = true;

http://www.c-sharpcorner.com/uploadfile/kirtan007/make-form-stay-always-on-top-of-every-window/

于 2013-03-19T22:43:26.997 に答える
0

他のプログラムがフォーカスを得るのを阻止できる Windows フォーム アプリケーションを作成することはできません。Windows 自体はこれを許可しません。これを回避する唯一の方法は、OpenGLまたはDirectXアプリケーションをフル スクリーン モードで作成することです。これにより、ユーザーは他のアプリケーションを見ることができなくなります。ただし、これでも、ユーザーはAlt+Tab他のアプリケーションに戻ることができます。

于 2013-03-20T06:51:08.597 に答える