0

アプリケーションにキーボード処理コードがあります(例:Ctrl+ ) C

私のアプリケーションのユーザーの中には、キーボードを非常に速く操作する人がいるため(両方を押しCtrlてすぐに押しCて放す)、イベントハンドラーはキーボードを十分に速く取得できません。

この効果は、WindowsフォームWPFの両方で発生します。

このWindowsフォームの例をご覧ください。物を固定する方法について何か提案があれば、私は幸せです。このサンプルを使用して再現することができます(ただし、迅速に行う必要があります)。

他のアプリケーションがどのようにプログラムされているのか疑問に思います。VisualStudioを使用します。そこでは、そのショートカットをどれだけ速く入力するかは関係ありません。期待どおりに動作します。

サンプル:ショートカットが正常にキャプチャされると、100ミリ秒間赤く着色される1つのパネルを含むウィンドウがあります。

using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KeyboardShortcutTest
{
    public partial class Form1 : Form
    {
        private TaskScheduler _uiScheduler;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
            KeyUp += Form1_KeyUp;
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.C)
            {
                ColorizePanelRed(_displayPanel);
            }
        }

        private void ColorizePanelRed(Panel panel)
        {
            Color c = panel.BackColor;

            Task.Factory.StartNew(() => { panel.BackColor = Color.Red; }, CancellationToken.None, TaskCreationOptions.None, _uiScheduler)
                .ContinueWith(t => { Thread.Sleep(100); })
                .ContinueWith(t => { panel.BackColor = c; }, _uiScheduler);
        }
    }
}
4

1 に答える 1

2

Ctrl問題は、一部のユーザーがキーを手放す前に手放すのが速すぎることである可能性がありCます。KeyUpの代わりにKeyDownイベントをキャッチすることは、これらの問題を回避するための良い方法だと思います。

于 2012-07-26T11:13:13.777 に答える