2

ユーザーから入力された値を取得してchar変数に保存しようとしていますが、問題は何も発生しないことです。問題はフォームフォーカスにあると思います。これはコードであり、実行するとエラーが発生しますが、何も起こりません。私が間違ったことは何ですか?

        char keyPressed;

        public FrmZigndSC()
        {
            InitializeComponent();
            this.Focus();
        }

        private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            keyPressed = e.KeyChar;

            LblResult.Text += Convert.ToString(keyPressed);
        }
4

6 に答える 6

2

このコードで試すことができます-に基づくKeyPressEventHandler

public FrmZigndSC()
{
       InitializeComponent();
       this.Focus();

       //Subscribe to event
       this.KeyPress += new KeyPressEventHandler(FrmZigndSC_KeyPress);
}


private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
        keyPressed = e.KeyChar;
        LblResult.Text += Convert.ToString(keyPressed);


        // Indicate the event is handled.
        e.Handled = true;
}
于 2012-09-17T12:59:18.340 に答える
1

空の小さなWindowsフォームプロジェクトでそれを再現しようとしました。このコードは、Shownイベントハンドラーがなくても問題なく機能しました。

public partial class FrmZigndSC : Form
{
    public FrmZigndSC()
    {
        InitializeComponent();

        this.KeyPress += (s, e) => this.LblResult.Text += e.KeyChar.ToString();

        // this might be a solution, but i did not need it
        this.Shown += (s, e) => this.Activate();
    }
}

とにかく使用してみてthis.Activate()、それが役立つかどうかを確認することができます。フォームにテキストボックスなどの他の入力コントロールがある場合は、フォームのプロパティをtrueに設定してみてください。KeyPreview

于 2012-09-17T13:00:03.753 に答える
1

アプリケーションのメッセージパイプラインから重要な通知を受け取りたい場合は、要素のフォーカスを中継して、この場合、アーキテクチャを脆弱にします。アプリ内の他のフォームからフォーカスされることを保証することはできません。または、フォームがそのイベントを吸収するコントロールによってカバーされていないことを保証することはできません。フォーカスのあるフォームを強制することはできません。これは、UXデザインが完全に悪いためです(これが100%機能する方法で実装できる場合でも、よくわかりません)。

代わりに、 IMessageFilterから派生したクラスを宣言することができます。

public class MessageFilter : IMessageFilter
{
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;

        public bool PreFilterMessage(ref Message m)
        {
            // Intercept KEY down message
            Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;

            if ((m.Msg == WM_KEYDOWN)
            {
                 //get key pressed  

                 return true;
            }        
            else
            {
                return false;
            }


        }
}

そしてそれをあなたのアプリケーションに登録した後:

MessageFilter filter = new MessageFilter(); //init somewhere 


Application.AddMessageFilter(filter ); // add 

..... 

//on application end don't forget to remove it 
Application.RemoveMessageFilter(filter );
于 2012-09-17T13:00:16.913 に答える
0

あなたが与えたコードは私にとってはうまく機能しています。スタートアップページをFrmZigndSCに設定して、再試行してください。

于 2012-09-17T13:01:50.823 に答える
0

this.Focus()の代わりにFocusManagerを使用すると、うまくいくはずです。

http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.aspx

于 2012-09-17T12:54:35.203 に答える
0

問題は、フォームに異なるコントロールがあり、ケトプレスをキャッチすることだと思います。私は自分のコントロールにDateTimePickerを使用して同じ問題を抱えていました。

それらをすべて削除してから試してみてください。うまくいきます。そして、その時点から、コントロールを再度追加して、どちらが問題であるかを確認します。

于 2012-09-17T13:00:04.963 に答える