AHK有啥办法持续监测某个状态以运行指定命令吗?

类似安卓上的Tasker
比方说当
运行某程序时 执行命令
当前窗口全屏时 执行命令
指定音量时 执行命令

前置条件可以写, 执行的命令可以写
就是持续监测这个有啥好办法吗?
loop循环吗?

放心循环就行。一般来说资源占用非常低。

写了个不在桌面且窗口大于1200*900时暂停动态壁纸的东西
很简单几句头都要秃了…
本来很简单就行,但是一秒执行一次命令我倒没什么,但是鼠标隔一秒会转下圈就很烦.
想半天怎么判断前一秒不是桌面,后一秒还不是桌面的情况…
最后 1+1解决.
不是桌面 2
然后怕那种1+1一直加下去数米破产(会吗?),不是桌面-不是桌面2+2
至于桌面一秒一执行我管不了了…再套层娃我要晕倒了.
…感觉太蠢了

    loop
    {
    WinGetPos,,,w,h,a
    Winget,s,ProcessName,a 
    f := InStr(s,"explorer")
    if f=1
    {
    run wp mpv  set pause no
    v = 1
    }
    Else
    v := v+v

    if (v=2 and w>1200 and h>900)
    {
    run wp mpv  set pause yes
    v=2
    }
    Sleep 1000
    }

这没有缩进的代码,都给我看睡着了

对的,非专业人士就这样…
参数命名也是想到啥就是啥,能运行起来就行:cry:

代码缩进是编程的基本素养。

通过使用 Tab 键使代码向右缩进来表达层级,让代码变得更加容易阅读。

然后 markdown 语法下是支持插入代码段的,并且可以指定代码的语言,然后进行高亮显示。我把你的代码整理一下放在下面,你看看区别:

loop {
  WinGetPos,,,w,h,a
  Winget,s,ProcessName,a
  f := InStr(s,"explorer")
  if (f=1){
    run wp mpv  set pause no
    v = 1
  }
  Else{
    v := v+v
  }
  if (v=2 and w>1200 and h>900){
    run wp mpv  set pause yes
    v=2
  }
  Sleep 1000
}

虽然内容上基本是一致的,但你看看阅读体验是不是不一样的。

感觉上面的代码可以这样简化一下:

loop {
  WinGetPos, , ,w ,h ,a
  Winget, s, ProcessName, a
  f := InStr(s, "explorer")
  if (f=1){
    run wp mpv  set pause no
  }else if (w>1200 and h>900){
    run wp mpv  set pause yes
  }
  Sleep 1000
}

我一开始就是这样的
但是下面这段会每一秒运行一次,也就是我上面说的怎么判断前一秒不是桌面,后一秒还不是桌面
为了判断这个所以加了个变量v,怎么在一个LOOP中修改并判断我还想了半天
在桌面时 v=1
然后 else 只运行下个if的判断语句 v+v=2
if 判断上个 else v+v, 2是回到了一次桌面,其他的数值就是没回.
在 if 后续给予 v+v!=2 的变量 我给予的是 v=2
这里不给这个 v=2 的变量也行,但是会一直*2上去,我怕一段时间会爆掉所以在这重置v的数值.
这时 if 判断前 v+v=4 就不会继续进行命令了.

到是 f 的变量是没必要的,可以直接 if InStr(s,"explorer"),但是我一开始不是想也在这给予判断嘛,所以就给了个f的变量,方便和准备加进去的变量做类似第二个if的判断,但是加半天加不进.没有初始变量进行不下去会导致整个都不行.

markdown 语法之类我只能…我最开始github还不会多行代码 格式化,后面才明白和单行一样选择然后点击按钮(对,让我手动输入bbcode之类的我都不会- -)

else if (w>1200 and h>900){
    run wp mpv  set pause yes
  }

我没测试,大概是下面这个意思。

isRunning := 1
loop {
  If WinActive("ahk_class WorkerW ahk_exe Explorer.EXE"){
    if(!isRunning){
      run wp mpv  set pause no
      isRunning := 1
    }
  }else{
    if(isRunning){
      WinGetPos, , ,w ,h ,a
      if (w>1200 and h>900){
        run wp mpv  set pause yes
        isRunning := 0
      }
    }
  }
  Sleep 1000
}

markdown 下面插入代码的格式如下:

```ahk

这里粘贴代码

```

上面所使用的标点是反引号,就是数字 1 左边那个

我试过 If WinActive 甚至#IfWinActive
比方说限定在 桌面中 一分钟LOOP一次, 其他窗口一秒一次.
但在loop中效果不怎么好.(完全运行不了)

这段代码其实还是一样的…
if(isRunning) 在非桌面的1200*900窗口的每一秒都是真的,然后继续运行下面的命令…
我纠结了半天想出了上面那个蠢方法.
算啦 没必要纠结这个啦,作为非专业人士,我只要运行起来就行(非骄傲,…)

解决了,比我的蠢方法优雅多了.

奇了怪了 能运行而且只运行一次
if(isRunning)
为什么第一次loop是真(运行后续),第二次就假了(不运行)?

哦哦哦…
if 1=1
绝了

我知道怎么测试,就是懒,而且最近不写 AHK,他的语法和其他语言差异又比较大,我得对照着文档去弄……对,然后人还很懒,2333

上面代码应该就少写了一个空格,我加上了。我这里测试没什么问题,喵~

1 Like