0

キー F1 ~ F3 を順番に押すアルゴリズムを書きたいと思います。私のフォームには次のコントロールがあります。

lblF1
textboxF1
lblF2
textboxF2
lblF3
textboxF3
btnStart

textboxF1-textboxF3 には秒単位の時間が入力されます。これは、プログラムがホットキーを押すときです。F1 と F2 のように、プログラムが 2 つのキーを同時に押せないようにすることが重要です。1 秒間に複数のキーを押すことはできません。btnStart をクリックすると、Run() が呼び出されます。

これは私がこれを解決しようとした方法です:

static int counterF1 = 9999;
static int counterF2 = 9999;
static int counterF3 = 9999;

    public void Run()
    {
        counterF1 = 9999;
        counterF2 = 9999;
        counterF3 = 9999;
        while (true)
        {
            Loop();
        }
    }

    public void Loop()
    {
        bool used = false;

            if (counterF1 >= (int)textboxF1.text)
            {
                counterF1 = PressKey(VK_F1);
                used = true;
            }

            if (counterF2 >= (int)textboxF2.text)
            {
                counterF2 = PressKey(VK_F2);
                used = true;
            }

            if (counterF3 >= (int)textboxF3.text)
            {
                counterF3 = PressKey(VK_F3);
                used = true;
            }
        if (used == false)
        {
            IncrementCounters();
            Delay(1000);
        }
    }

    public double PressKey(uint key)
    {
        myPostMessageA(hWindow, WM_KEYDOWN, (uint)key, (uint)key); 
        IncrementCounters();
        return 1; //return 1 because one second
    }

    public void IncrementCounters()
    {
        counterF1++;
        counterF2++;
        counterF3++;
    }

しかし、多くの場合、キーを押しません (遅すぎる可能性がありますが、省略はできません)。このアルゴリズムの作り方を教えてください。

4

1 に答える 1

1

KeyStroke特別なキーに必要なデータを格納するクラスを使用します。

public class KeyStroke
{
    public int period { get; set; } // Period in which to hit key
    public int next { get; set; } // ticks to the next hit of this key
    public int VK { get; set; } //KeyCode
}
public List<KeyStroke> keys = new List<KeyStroke>();

テキスト ボックスからデータを読み取り、シミュレーションを開始するには、Initialize() メソッドが必要です。1 秒間隔のタイマーを使用してシミュレーションを実行します。私の例では、テキスト ボックスから読み取るのではなく、定数値を使用します。入力とエラー処理を追加します。WPF を使用する場合は、KeyStroke オブジェクトをテキスト ボックスにバインドできます。

void Init()
{
    //Initialize keys with according periods from input
    keys.Clear();
    keys.Add(new KeyStroke() { VK = VK_F1, period = 1, next = 1 });
    keys.Add(new KeyStroke() { VK = VK_F2, period = 10, next = 10 });
    keys.Add(new KeyStroke() { VK = VK_F3, period = 5, next = 5 });

    //sort keys by period (descending), in order to handle long period keys, too
    keys.Sort((first, second) => second.period.CompareTo(first.period));

    //Start the program
    var t = new DispatcherTimer();
    t.Interval = TimeSpan.FromSeconds(1);
    t.Tick += new EventHandler(t_Tick);
    t.Start();
}

tick イベントはあなたのものに似ています:

void t_Tick(object sender, EventArgs e)
{
    bool used = false;
    foreach (var key in keys)
    {
        if (key.next <= 0 && !used)
        {
            PressKey(key.VK);
            key.next = key.period;
            used = true;
        }
        key.next--;
    }
}
于 2012-07-14T14:44:45.907 に答える