通过相同的键切换无限循环

时间:2015-12-30 23:07:06

标签: autohotkey

我希望能够按键并运行无限循环,并能够按相同的键来停止循环。在一个简单的例子中,我希望脚本无限期地点击:

XButton2::
if (Doing = 0)
{
  Doing := 1
  While Doing = 1
  {
     Click
  }
  return
} else {
 Doing := 0
}

不幸的是,这不起作用 - XButton2不再响应,因为它正在运行脚本。我可以通过其他密钥切换Doing := 0,但我希望它与XButton2相同。这样做的简单方法是什么?我会避免复杂的解决方案。

1 个答案:

答案 0 :(得分:2)

使用timed subroutine。这就是你通常在ahk中开始/停止循环的方式。

例如:

#include <cstddef>
#include <string>
#include <stdexcept>

template <size_t N>
constexpr size_t arrLen(int(&)[N]) { return N; }

template <typename T, size_t N> using Array = T[N];

int main(int argc, char** argv)
{
    Array<int, 6> arr = { 1, 2, 3, 4, 5, 6 };

    arrLen(arr);

    int * p = &arr[1];
    size_t len = argc>1? std::stoul(argv[1]) : 3ul;

    size_t result;
    switch (len) {
        case 1:  result = arrLen(reinterpret_cast<Array<int, 1>&  >(*p)); break;
        case 2:  result = arrLen(reinterpret_cast<Array<int, 2>&  >(*p)); break;
        case 3:  result = arrLen(reinterpret_cast<Array<int, 3>&  >(*p)); break;
        case 4:  result = arrLen(reinterpret_cast<Array<int, 4>&  >(*p)); break;
        case 5:  result = arrLen(reinterpret_cast<Array<int, 5>&  >(*p)); break;
        case 6:  result = arrLen(reinterpret_cast<Array<int, 6>&  >(*p)); break;
        case 7:  result = arrLen(reinterpret_cast<Array<int, 7>&  >(*p)); break;
        case 8:  result = arrLen(reinterpret_cast<Array<int, 8>&  >(*p)); break;
        case 9:  result = arrLen(reinterpret_cast<Array<int, 9>&  >(*p)); break;
        case 10: result = arrLen(reinterpret_cast<Array<int, 10>& >(*p)); break;
        case 11: result = arrLen(reinterpret_cast<Array<int, 11>& >(*p)); break;
        default: throw std::range_error("len");
    }

    return result;
}

这就是我经常这样做的方式,虽然我很想看到更紧凑的版本。