【问题标题】:Press and hold key for a given millisecond按住键给定毫秒
【发布时间】:2019-06-25 12:06:14
【问题描述】:

我编写了一个代码,它将根据按下的时间(毫秒)按下一个键。我正在使用question 上的答案来发送关键事件。

这是代码:

public void DebugReplayKeys()
{
    long startTime = 0;
    Thread td = new Thread(() =>
    {
        int currentIndex = 0;
        bool flag = true;
        while (flag)
        {
            long ctime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
            long runtime = ctime - startTime;
            var rpk = recordedPressedKeys[currentIndex];
            if (runtime >= rpk.eventTime)
            {
                //create timer for simulate key hold time??
                //then release key if timer is elapsed??
                Console.WriteLine(rpk.key); //gonna be replaced by (keybd_event)
                currentIndex++;
            }
            if(currentIndex > recordedPressedKeys.Count -1)
            {
                flag = false;
            }
        }
    });
    td.SetApartmentState(ApartmentState.STA);
    startTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
    td.Start();
}

这是用于存储按键事件的对象:

class RecordedPressedKeys
{
    public long eventTime;
    public Keys key;
    public long holdTime;
}

现在,如何模拟键盘按下的时间?
我需要使用 Timers.Timer 吗?
使用keybd_event 的按键向下标记并按住按键,在计时器结束后释放按键?

【问题讨论】:

  • 这不是您要更改的按键事件参数的一部分吗?
  • ToUnixTimeMillisecondsctime - startTime 有什么意义?如果您想测量时间,请使用Stopwatch,它适用于纳秒刻度。 DateTime also stores ticks internally 这意味着 ToUnixTimeMilliseconds() 最多失去精度。简单地从另一个中减去一个 DateTime 将返回一个精度更高的 Timespan,而无需支付 ToUnixTimeMilliseconds 背后的操作成本
  • 至于问题本身,你想做什么?没有尝试按键的代码。 所有 代码看起来像是在尝试创建一个计时器。您可能可以用计时器替换 all 这段代码,也许是 System.Threading.Timer

标签: c#


【解决方案1】:

这就是我想要做的。我只需要模拟按键被按下的时间。 我使用了System.Timers.Timer。在计时器结束后发送按下事件和释放事件。

public void DebugReplayKeys()
        {
            long startTime = 0;
            Thread td = new Thread(() =>
            {
                int currentIndex = 0;
                bool flag = true;
                while (flag)
                {
                    long ctime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
                    long runtime = ctime - startTime;
                    var rpk = recordedPressedKeys[currentIndex];
                    if (runtime >= rpk.eventTime)
                    {
                        var tmr = new System.Timers.Timer(Convert.ToDouble(rpk.eventTime));
                        tmr.AutoReset = false;
                        tmr.Elapsed += delegate
                        {
                            ReleaseKey(rpk.key);
                        };
                        PressKey(rpk.key);
                        tmr.Enabled = true;
                        currentIndex++;
                    }
                    if(currentIndex > recordedPressedKeys.Count -1)
                    {
                        flag = false;
                    }
                }
            });
            td.SetApartmentState(ApartmentState.STA);
            startTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
            td.Start();
        }

private void PressKey(Keys key)
        {
            keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, 0);
        }

private void ReleaseKey(Keys key)
        {
            keybd_event((byte)key, 0, KEYEVENTF_KEYUP, 0);
        }

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多