欢迎您, 游客
您必须先注册才能在我们的站点发帖。

用户名
  

密码
  





论坛搜索

(高级搜索)

最近的主题
新人报到专用贴
最近发表: a846296695
2017-01-14 04 : 15
» 回复: 1202
» 人气: 427426
怎样写快速输入的列表UI,或类似工具?
最近发表: gdqb521
2017-01-10 15 : 31
» 回复: 2
» 人气: 216
[过时]AutoHotkey 1.0.48.05准...
最近发表: AHKKKK
2017-01-08 14 : 48
» 回复: 86
» 人气: 47659
xp系统如何让任务栏托盘区一行显示日期和时间
最近发表: 蓝色之泪
2017-01-07 01 : 07
» 回复: 21
» 人气: 16714
【键盘党利器LabelControl_vZz】Wi...
最近发表: robertL
2017-01-02 12 : 53
» 回复: 4
» 人气: 1441
;scite乱码如何解决
最近发表: robertL
2016-12-30 22 : 18
» 回复: 4
» 人气: 1752
热键 循环 问题
最近发表: feiyue
2016-12-30 00 : 50
» 回复: 1
» 人气: 186
来大神帮帮忙啊 给改改 我是新手 谢谢了哈
最近发表: zch3509
2016-12-28 17 : 48
» 回复: 0
» 人气: 144
热键问题!
最近发表: feiyue
2016-12-28 16 : 45
» 回复: 16
» 人气: 741
历史记录的数组实现 V1.1
最近发表: robertL
2016-12-27 15 : 13
» 回复: 0
» 人气: 119

 
Smile 历史记录的数组实现 V1.1
发布: robertL - 2016-12-27 15 : 13 - 无回复

要求:如同常规历史记录,新的靠前,旧的靠后,消除重复的,有总数量限制。

代码:
;http://ahk8.com/thread-6133.html 《历史记录的数组实现》
;robetL
recent:={}    ;数据
updateRecent(date){
    static maxLength:=2    ;设置最大记录数量
    global recent
    loop % length:=objLength(recent)
        if(recent[a_index]==date){    ;删除重复的
            objRemoveAt(recent,a_index)
            break
        }
    objInsertAt(recent,1,date)    ;新的放于最前
    if((length:=objLength(recent))>maxLength)    ;删除多的
        objdelete(recent,maxLength+1,length)
}
可另行使用持久化方法保存数据recent
如:Obj2AHKINI和数组互操作互转函数及示例@thinkai
测试
代码:
objIsEqual(objA,objB){
    for key,value in objA{
        if(objB[key]!=value)
            return false
    }
    for key,value in objB{
        if(objA[key]!=value)
            return false
    }
    return true
}
assert(condition,message:="failed"){
    if not condition
        Msgbox % message
}
updateRecent("a")
assert(objIsEqual(recent,["a"]),1)
updateRecent("b")
assert(objIsEqual(recent,["b","a"]),2)
updateRecent("c")
assert(objIsEqual(recent,["c","b"]),3)
updateRecent("b")
assert(objIsEqual(recent,["b","c"]),4)

打印这项 推荐给朋友

Smile 求数组最大值
发布: robertL - 2016-12-27 13 : 47 - 无回复

代码:
;http://ahk8.com/thread-6132.html <求数组最大值>
;robertL
getMaxInArray(p*)
{
    max:=objpop(p)
    loop % objLength(p)
        max<p[A_index]?max:=p[A_index]:""
    return max
}
测试
代码:
generateArray(length){
    d:={}
    Loop % length
    {
        Random, rand, 1, length*10
        d[A_index]:=rand
    }
    return d
}
PrecisionTime()
{
    DllCall("QueryPerformanceCounter", "Int64*", Time)
    return, Time
}
array:=generateArray(10000)
t1:=PrecisionTime()
r:=getMaxInArray(array*)
t2:=PrecisionTime()
Msgbox % "最大值" r ",用时" t2-t1 "."
其他方法
  • @汐潮
    代码:
    getMaxInArray(p*)
    {
        f:=[]
        for i,n in p
            f[n]:=""
        return f.MaxIndex()
    }
  • @hitman sunwind
    代码:
    getMax(arr)
    {
        max:=arr[1]
        for key,val in arr
        {
            max:= max<=val ? val:max
        }
        return  max
    }

打印这项 推荐给朋友

Photo 【BingBgZz】每日桌面Bing壁纸 v1.4
发布: Zz - 2016-12-23 18 : 05 - 无回复

# BingBgZz 每日桌面Bing壁纸 v1.4

**每日开机运行后会下载当日bing壁纸并设置为桌面壁纸,用完即关**


引用:global bgDay=0 ;~;获取必应今天壁纸,1为昨天,以此类推可下载历史壁纸
global bgNum=1 ;~;下载bgDay至前1天壁纸数量,最大为前8天
global bgMax=8 ;~;下载后最多只保留前8天的壁纸,设置0为不限制数量(注:bgFlag不能为1)
global bgFlag=2 ;~;壁纸文件名称形式,0为日期YYYYMMDD,1为英文名称_分辨率,2为英文名称_日期
global bgDir:="D:\Users\Pictures\bing" ;~;壁纸图片保存路径,如bgMax不是0必须是单独文件夹,防止丢失其他图片

用户可自定义配置以上几项,不想看到xml可以设置下载到缓存目录:`SetWorkingDir,%A_Temp%`

---

v1.4 第二次运行就会随机更换壁纸了

---

v1.3 完善分辨率,右下角显示壁纸介绍

在虚拟机上测试了从640x480像素到3840x2160像素24种分辨率,结果是bing官方壁纸基本良好支持1024x768、1366x768、1920x108​0,而1920x1200在一些壁纸是没有的,所以加了【下载壁纸失败后用其它分辨率替代】

---

v1.2更新内容:
  • 获取屏幕的分辨率,根据分辨率下载不同尺寸壁纸,感谢群友`因斯坦爱`提供
  • 壁纸数量超过设定删除最早一张

---

是的,顺带做了下载历史壁纸的隐藏功能:

设置`bgNum = 8`即获取前8天的壁纸;
或者同时再设置`bgDay=8`就是前8天的再前8天壁纸;
最后把 `;~ F2::` 改为 `F2::` 再按 F2 键开始下载

引用:> PS:如果想继续使用前一天的壁纸,可右键桌面-个性化-选择历史壁纸,或打开壁纸存放目录-右键设置为桌面背景

项目最新测试版GitHub更新:https://github.com/hui-Zz/BingBgZz

源码:
代码:
/*
╔═════════════════════════════════
║【BingBgZz】每日桌面Bing壁纸 v1.4
║ 联系:[email protected]
║ 讨论QQ群:3222783、271105729、493194474
║ by Zz @2016.12.23
║ 最新版本:github.com/hui-Zz/BingBgZz
╚═════════════════════════════════
*/
#NoEnv                    ;~;不检查空变量为环境变量
FileEncoding,UTF-8        ;~;下载的XML以中文编码加载
SetBatchLines,-1        ;~;脚本全速执行(默认10ms)
SetWorkingDir,%A_ScriptDir%    ;~;脚本当前工作目录
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【用户自定义变量】
global bgDay=0            ;~;下载必应今天壁纸,1为昨天,以此类推可下载历史壁纸
global bgNum=8            ;~;下载bgDay至前1天壁纸数量,最大为前8天
global bgMax=0            ;~;下载后最多只保留前8天的壁纸,设置0为不限制数量(注:bgFlag不能为1)
global bgFlag=2            ;~;壁纸文件名称形式,0为日期YYYYMMDD,1为英文名称_分辨率,2为英文名称_日期
global bgDir:=A_ScriptDir "\bing" ;~;壁纸图片保存路径,如bgMax不是0必须是单独文件夹,防止丢失其他图片
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【初始化全局变量】
;~;默认自动根据分辨率获取,可固定为"1024x768"|"1366x768"|"1920x1080"|"1920x1200"(带上双引号)
global DPI:=BG_GetDPI()    
;~;必应壁纸XML地址
global bing:="http://cn.bing.com"
global bgImg:=bing "/HPImageArchive.aspx?idx=" bgDay "&n=" bgNum
global bgXML            ;~;XML配置内容
global bgImgUrl            ;~;壁纸下载地址
global bgPath            ;~;壁纸保存路径
IfNotExist, %bgDir%
    FileCreateDir, %bgDir%
XML_Download()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【读取XML,下载图片,设置桌面背景,如已下载则随机更换壁纸】
;~ F1::
    FileRead, bgXML, %A_ScriptDir%\bingImg.xml
    RegExMatch(bgXML, "<url>(.*?)</url>", bgUrl)
    RegExMatch(bgXML, "<enddate>(.*?)</enddate>", bgDate)
    BG_GetImgUrlPath(bgUrl1,bgDate1)
    IfNotExist,%bgPath%
    {
        RegExMatch(bgXML, "<copyright>(.*?)</copyright>", bgCR)
        ToolTip,%bgCR1%,A_ScreenWidth,A_ScreenHeight
        BG_Download()
        BG_DownFail()
        BG_Wallpapers()
        BG_DeleteBefore()
    }else{
        FileCopy, %bgDir%, %bgDir%
        Random, roll, 1, %ErrorLevel%
        Loop,%bgDir%\*.jpg
        {
            if(A_Index=roll){
                bgPath:=A_LoopFileLongPath
                BG_Wallpapers()
            }
        }
    }
return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【批量下载历史壁纸,搭配bgDay和bgNum使用】
;~ F2::
    FileRead, bgXML, %A_ScriptDir%\bingImg.xml
    pos = 1
    While, pos := RegExMatch(bgXML, "<enddate>(.*?)</enddate>", bgDate, pos + 1)
    {
        DPI:=BG_GetDPI()
        RegExMatch(bgXML, "<url>(.*?)</url>", bgUrl, pos)
        BG_GetImgUrlPath(bgUrl1,bgDate1)
        BG_Download()
        BG_DownFail()
        bgPaths .= bgPath . "`n"
    }
    MsgBox,下载完成`n%bgPaths%
return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【获取壁纸下载地址和保存路径】
BG_GetImgUrlPath(bgUrl1,bgDate1){
    RegExMatch(bgUrl1, "[^/]+$", bgName)
    if(bgFlag=1){
        bgName:=RegExReplace(bgName, "i)[^_]+\.jpg$", DPI ".jpg")
    }else if(bgFlag=2){
        bgName:=RegExReplace(bgName, "i)[^_]+\.jpg$", bgDate1 ".jpg")
    }else{
        bgName:=bgDate1 . ".jpg"
    }
    bgImgUrl=%bing%%bgUrl1%
    bgImgUrl:=RegExReplace(bgImgUrl, "i)[^_]+\.jpg$", DPI ".jpg")
    bgPath=%bgDir%\%bgName%
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【下载必应壁纸XML配置信息】
XML_Download(){
    URLDownloadToFile,%bgImg%,%A_ScriptDir%\bingImg.xml
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【下载必应壁纸图片】
BG_Download(){
    URLDownloadToFile, %bgImgUrl%, %bgPath%
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【必应壁纸设置为桌面壁纸】
BG_Wallpapers(){
    DllCall("SystemParametersInfo", UInt, 0x14, UInt,0, Str,"" bgPath "", UInt, 2)
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【获取屏幕的分辨率】
BG_GetDPI(){
    SysGet, Mon, Monitor
    ratio := MonRight/MonBottom
    if (ratio = 16/9)
        return "1920x1080"
    else if (ratio = 16/10)
        return "1920x1200"
    else if (ratio = 4/3)
        return "1024x768"
    else if (MonRight = 1366 && MonBottom = 768)
        return "1366x768"
    else
        return "1920x1080"
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【壁纸数量超过设定删除最早一张】
BG_DeleteBefore(){
    if(bgFlag!=1 && bgMax>0){
        FileCopy, %bgDir%, %bgDir%
        if(bgMax<ErrorLevel){
            tMax := 1
            tPath := bgPath
            Loop,%bgDir%\*.jpg
            {
                t1 := A_Now
                t2 := A_LoopFileTimeCreated
                t1 -= %t2%, Days
                if(t1>tMax){
                    tMax := t1
                    tPath := A_LoopFileLongPath
                }
            }
            if(RegExMatch(tPath, "i)[0-9]{8}\.jpg$")){
                FileDelete, %tPath%
            }
        }
    }
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;~;【下载壁纸失败后用其它分辨率替代】
BG_DownFail(){
    FileGetSize, bgSize, %bgPath%
    if (!FileExist(bgPath) || bgSize=0){
        DPI:="1920x1080"
        BG_GetImgUrlPath(bgUrl1,bgDate1)
        BG_Download()
    }
}
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

打印这项 推荐给朋友

  gesdy,一个模仿的、未完成的手势脚本
发布: aamii - 2016-12-19 18 : 13 - 无回复

提到Strokeit,想起我还曾经玩过ahk版本的手势,从官网扒了一些脚本,拼凑了一下,Strokeit太给力,所以也就没能玩下去了,发到这里,有兴趣的同学可以​玩玩。

; ==============妖==============
这个其实来自官网诸人的角度算法,比如lex、Learning one等人
显然,只是按照妖的风格,改了一下而已,不足百行
我的思路是用一些正则来匹配,比较“规矩的”手势
正则的判断的先后顺序,也可以作为条件之一,比如往右开口的v,如果没有定义这个手势,漏下去可以判断为C
这只是一个概念,里面只有一个示例正则,有兴趣的同学,可以发展一下,共同研究,^_^
脚本除了那个“方向角度算法”,其他部分简单,所以也没有注释了
; ==============妖==============

代码:
#SingleInstance
CoordMode, Mouse
global oAng:={0:"⑧",1:"①",2:"①",3:"②",4:"②",5:"③",6:"③",7:"④",8:"④",9:"⑤",10:"⑤",11:"⑥",12:"⑥",13:"⑦",14:"⑦",15:"⑧",16:"⑧"}
pressed := false
prev_gesture := ""
Gui, TrackOnScreen:+LastFound  +AlwaysOnTop -Caption +ToolWindow +HwndBB_Hwnd
Gui, TrackOnScreen:Color, black
WinSet, TransColor, black
Gui, TrackOnScreen:Show,NA
Gui, TrackOnScreen:Maximize
global BB_HDC := DllCall("GetDC", UInt, BB_Hwnd)
global BB_Pen := DllCall("CreatePen", UInt, 0, UInt, 3, UInt,0x0000FF)
SetTimer, recognize, 100
SetTimer, draw, 5
return
recognize:
    if (pressed)
    {
        MouseGetPos, NowX1, NowY1
        DX := NowX1 - PreX1
        DY := NowY1 - PreY1
        ADX := abs(DX)
        ADY := abs(DY)
        if (ADX > 40 or ADY > 40)
        {
            gesture := FindGesture(PreX1, PreY1, NowX1, NowY1)
            if (gesture != prev_gesture)
            {
                prev_gesture := gesture
                g_acum .= gesture
                Tooltip, %g_acum%, 800, 0
            }
            PreX1 := NowX1
            PreY1 := NowY1
        }
    }
    return
draw:
    if (pressed)
    {
        MouseGetPos, NowX, NowY
        PreX -= 1, PreY -= 1, NowX -= 1, NowY -= 1
        DllCall("SelectObject", UInt,BB_HDC, UInt,BB_Pen)
        DllCall("gdi32.dll\MoveToEx", UInt, BB_HDC, Uint,PreX, Uint, PreY, Uint, 0 )
        DllCall("gdi32.dll\LineTo", UInt, BB_HDC, Uint, NowX, Uint, NowY )
        PreX := NowX
        PreY := NowY
    }
    return
Rbutton Up::
;     WinSet, ReDraw,, ahk_id %BB_Hwnd%  ;这个方法好
    pressed := false
    prev_gesture := ""
    Tooltip
    if (g_acum != "")
    {
        ToolTip %g_acum%
        if RegExMatch(g_acum,"((⑥|)⑤(④|)③(②))|(⑥(⑤|)④(③|)②)|((⑥|)⑤(④|)③(②|))|((⑥|)⑤(④|)(③|)②)")
        ToolTip C
    }
    else
        Click right

Return
Rbutton::
    WinGetClass, WID, A
    pressed := true
    g_acum := ""
    MouseGetPos, PreX, PreY
    prex1:= PreX
    prey1:= Prey
Return
Esc::
    WinSet, ReDraw,, ahk_id %BB_Hwnd%
    return

FindGesture(StartX, StartY, EndX, EndY)
{
    x := EndX-StartX
    y := EndY-StartY
   if x = 0
   {
      if y > 0
        return "④"
      Else if y < 0
        return "⑧"
      Else
         return
   }
   Angle := ATan(y/x)*57.295779513
   if x > 0
      z:= Angle + 90
   Else
      z:= Angle + 270
    t:=Floor(z/22.5)
    return % oAng[t]
}

打印这项 推荐给朋友

  善用ahk,让strokeit在win10下起死回生
发布: aamii - 2016-12-18 14 : 33 - 回复 (1)

作为一款优秀的手势软件,Strokeit不再开发,有点小遗憾。
win8、win10下面,Strokeit会在每次划动手势的时候,在任务栏闪动一个“任务栏标签”,基本无法继续用下去。大部分人转向了其他同类软件,比如Strok​eplus。
其实最为ahker,可以简单的解决这个。


代码:
DetectHiddenWindows,on  ;这个也要加上
^+#s:: ;隐藏Strokeit的闪动任务栏,作者:妖
    Process,exist,strokeit.exe
    WinSet, ExStyle, +0x80, ahk_pid %errorlevel%
    return


或者你可以做一个Strokeitloader,每次启动Strokeit,自动进行上面这个过程,自动隐藏。
是不是哪个简洁高效的Strokeit又回来了?


补充一下:
Strokeit 需要兼容模式、管理员运行

打印这项 推荐给朋友

Smile 多持续互斥热键过程的示例
发布: robertL - 2016-11-25 15 : 02 - 回复 (14)

功能:使用热键触发的,各热键过程可持续循环,过程彼此间互斥的线程。
    源自我于“求助修改LOOP循环”中的回复,2#
示例×4:形如方式3,有代表性,实现推荐方式4。
    热键a/b/c触发不同的过程,a/b持续、c非持续,过程间互斥。

  1. 代码:
    ;《多持续互斥热键过程的示例》ahk8.com/thread-6116.html
    ;By RobertL
    #MaxThreadsPerHotkey 2
    a::
        if(!running_a){
            running_a:=true
            while(A_ThisHotkey=="a"){
                Tooltip a
            }
            running_a:=false
        }
        return
    b::
        if(!running_b){
            running_b:=true
            while(A_ThisHotkey=="b"){
                Tooltip b
            }
            running_b:=false
        }
        return
  2. 代码:
    ;《多持续互斥热键过程的示例》ahk8.com/thread-6116.html
    ;By RobertL
    #MaxThreadsPerHotkey 2
    a::
    b::
    c::    ;stop
        if(running){
            return
        }
        running:=true
        while(A_ThisHotkey!="c"){
            while(A_ThisHotkey=="a"){
                Tooltip a
            }
            while(A_ThisHotkey=="b"){
                Tooltip b
            }
        }
        running:=false
        return
  3. 封装了控制点,直接插入原用户代码即可,其他说明,见3#
    代码:
    ;《多持续互斥热键过程的示例》ahk8.com/thread-6116.html
    ;By RobertL
    ;====功能部分,无需用户配置====
    ;声明全局变量
    global 目标标签:=""
    ;====功能入口====
    启动(){
        if(目标标签!=A_ThisLabel){
            目标标签:=A_ThisLabel
            SetTimer,%目标标签%,-1
            Exit
        }
    }
    检测退出条件(){
        return 目标标签!=A_ThisLabel
    }
    检测并退出(){
        if(检测退出条件())
            Exit
    }
    ;====用户使用示例====
    a::
        启动()
        while(1){
            Tooltip a
            检测并退出()    ;退出方式1,结束过程(无法进行收尾过程)
        }
        ;return    ;无需
    b::
        启动()
        while(not 检测退出条件()){    ;退出方式2
            Tooltip b
        }
        ;可进行收尾过程
        return
    c::    ;无循环,进而无需检测退出
        启动()
        Tooltip c
        return
  4. 推荐@feiyue 的版本,较以上版本3考虑更周全。代码见4#,详述见7#8#
    新方式:带参数重启脚本实现终止当前过程,开始新过程,见15#
关键
  1. 在循环过程的循环条件/结束循环处进行过程控制
    使用热键A_ThisHotkey,或标签A_ThisLabel
  2. 在循环过程的循环体中结束当前过程
    使用Exit
  3. 热键线程的机制——新的挂起旧的。
    方式1、2中使用#MaxThreadsPerHotkey 2,最初的线程为工作线程,其后的线程被跳过(但状态会更新)。线程A无法结束线程B,需线程自行退出。
  4. 方式3使用定时器开始新热键过程的线程,避免热键线程的竞争、挂起
相关

打印这项 推荐给朋友

Lightbulb 【RunMenuZz】超轻便自由的快速启动应用工具
发布: Zz - 2016-11-09 17 : 57 - 回复 (6)

一直在寻找一种最快捷方便的应用启动工具,至今也用过了各种各样的,先总结下:
1. 自动搜索加载程序,启动方式是模糊搜索匹配形式,如Win+R运行、Listary、Launchy等
- 优点:不用操心配置、搜索强大
- 缺点:无软件分类、步骤繁琐不快捷,重选项多时需打全名
2. 纯手动配置,添加应用启动方式及参数,如AltRun、RunZ等
- 优点:步骤简单快速、可配置性高、功能强大
- 缺点:配置费时且易丢,一套配置不适用不同电脑

本人对效率启动感悟是:二八原则放在哪都是通用的,所有的软件只有“二”是最常用,怎么迅速打开二才是高效率的保证,而不是让那“八”的搜索结果来混淆视听

本人从第1、2种的缺点出发,现初步实现了一个超轻便自由的快速启动应用工具——RunMenuZz

首先用户需配置多个程序安装的父级目录,如C:\Program Files和D:\Program Files(不建议C:\,扫描全盘效率不高)
然后用户再自由配置一个应用启动菜单,在父级目录下的应用会自动识别运行,同名情况可使用全路径
每个菜单名首字母(或用&指定任意)便是启动快捷键,速度够快,可用|添加别名前缀
软件配置放在云同步盘可以完全通用所有不同电脑
快捷、自由、通用

======

大家用一段时间就会发现,启动常用软件就跟打字一样高效方便(`为热键):
`ww就是work分类下的word
`aw就是app下的Wiz
`sw就是sys下的WinRAR

代码:
/*
【RunMenuZz】超轻便自由的快速启动应用工具
联系:[email protected] 讨论QQ群:3222783、271105729、493194474
by Zz @2016.11.06
*/
#Persistent            ;~让脚本持久运行
#NoEnv                    ;~不检查空变量为环境变量
#SingleInstance,Force    ;~运行替换旧实例
ListLines,Off            ;~不显示最近执行的脚本行
SetBatchLines,-1        ;~脚本全速执行(默认10ms)
SetControlDelay,0        ;~控件修改命令自动延时(默认20)
SetWorkingDir,%A_ScriptDir%    ;~脚本当前工作目录
SplitPath,A_ScriptFullPath,,,,fileNotExt
iniFile:=fileNotExt ".ini"
IfNotExist,%iniFile%
    gosub,iniFileWrite
gosub,MenuTray
MenuObj:=Object()
menuRoot:=Object()
menuRoot.Insert("AppMenu")
menuLevel:=1

;~;[设定自定义显示菜单热键]
IniRead,menuKey,%iniFile%,key
try{
    Hotkey,%menuKey%,MenuShow,On
}catch{
    MsgBox,1,,[key]`n%menuKey%`t<—热键语法不正确`n`n`n详细请参照AutoHotkey按键列表,需要打开吗?
    IfMsgBox OK
        Run,http://ahkcn.sourceforge.net/docs/KeyList.htm
    return
}
;~;[读取软件安装目录下所有exe]
IniRead,appPath,%iniFile%,appPath
Loop,parse,appPath,`n
{
    IfExist,%A_LoopField%
    {
        Loop,%A_LoopField%\*.exe,0,1
        {
            fileName:=RegExReplace(A_LoopFileName,"i)\.exe$","")
            MenuObj[(fileName)]:=A_LoopFileLongPath
        }
    }else{
        MsgBox,路径不对: %A_LoopField%
    }
}
;~;[读取自定义树形菜单设置]
IniRead,menuName,%iniFile%,menuName
Loop,parse,menuName,`n
{
    if(RegExMatch(A_LoopField,"^-")){
        ;~;[生成目录树层级结构]
        menuItem:=RegExReplace(A_LoopField,"^-+")
        menuLevel:=StrLen(RegExReplace(A_LoopField,"(^-+).*","$1"))
        if(menuItem){
            Menu,%menuItem%,add
            Menu,% menuRoot[menuLevel],add,%menuItem%,:%menuItem%
            menuLevel+=1
            menuRoot[menuLevel]:=menuItem
        }else if(menuRoot[menuLevel]){
            Menu,% menuRoot[menuLevel],Add
        }
    }else if(InStr(A_LoopField,"|")){
        ;~;[生成有前缀备注的应用]
        menuDiy:=StrSplit(A_LoopField,"|")
        appName:=RegExReplace(menuDiy[2],"i)\.exe$")
        if(MenuObj[appName]){
            MenuObj[menuDiy[1]]:=MenuObj[appName]
        }else{
            MenuObj[menuDiy[1]]:=menuDiy[2]
        }
        MenuAdd(menuRoot[menuLevel],menuDiy[1])
    }else if(RegExMatch(A_LoopField,"i)^(\\\\|.:\\).*?\.exe$") && FileExist(A_LoopField)){
        ;~;[生成完全路径的应用]
        SplitPath,A_LoopField,fileName,,,nameNotExt
        MenuObj[nameNotExt]:=A_LoopField
        MenuAdd(menuRoot[menuLevel],nameNotExt)
    }else{
        ;[生成已取到的应用]
        appName:=RegExReplace(A_LoopField,"i)\.exe$")
        if(!MenuObj[appName])
            MenuObj[appName]:=A_LoopField
        MenuAdd(menuRoot[menuLevel],appName)
    }
}
if(ini){
    TrayTip,,RunMenuZz菜单初始化完成,3,1
    Run,%iniFile%
}
ini=true
return
;~;[生成菜单]
MenuAdd(menuName,menuItem){
    global MenuObj
    Menu,%menuName%,add,%menuItem%,MenuRun
    try {
        Menu,%menuName%,Icon,%menuItem%,% MenuObj[(menuItem)],0
    } catch e {
        ;~ Menu,%MenuName%,Delete,%menuItem%
    }
}
;~;[显示菜单]
MenuShow:
    if(!ini){
        TrayTip,请不要太急,RunMenuZz菜单正在生成中...再试一下,3,1
        return
    }
    try{
        Menu,% menuRoot[1],Show
    }catch{
        MsgBox,菜单显示错误,请检查%iniFile%中[menuName]下面的菜单配置
    }
    return
;~;[菜单运行]
MenuRun:
    Run,% MenuObj[(A_ThisMenuItem)]
    return
;~;[托盘菜单]
MenuTray:
    Menu,Tray,NoStandard
    Menu,Tray,add,重启(&R),Menu_Reload
    Menu,Tray,add
    Menu,Tray,add,挂起(&S),Menu_Suspend
    Menu,Tray,add,暂停(&A),Menu_Pause
    Menu,Tray,add,退出(&X),Menu_Exit
    Menu,Tray,Default,重启(&R)
    Menu,Tray,Click,1
    return
Menu_Reload:
    Reload
    return
Menu_Suspend:
    Menu,tray,ToggleCheck,挂起(&S)
    Suspend
    return
Menu_Pause:
    Menu,tray,ToggleCheck,暂停(&A)
    Pause
    return
Menu_Exit:
    ExitApp
    return
;~;[配置生成]
iniFileWrite:
    ini:=true
    FileAppend,% ";【RunMenuZz】超轻便自由的快速启动应用工具`n;联系:[email protected] 讨论QQ群:3222783、271105729、493194474`n;by Zz @2016.11.06`n;初次使用请先按一下F1显示菜单`n",%iniFile%
    FileAppend,% "[key]`nF1`n;【自定义显示菜单热键】参照AutoHotkey按键列表`n;单键如:【``】【F1】【LWin】【RAlt】【AppsKey】`n;组合键如:左A​lt+z:【<!z】左Win+z:【<#z】左Ctrl+``:【<^``】右Shift+/:【>+/】`n`n",%iniFile%
    FileAppend,% "[appPath]`n;【软件安装根目录】`n;已加入系统[运行]路径的目录无需添加,如:C:\Windows的应用`nC:\Program Files\`nC:\Program Files (x86)\`n`n[menuName]`n;【自定义树形启动菜单】`n;如果有多个同名应用,请加上全路径`n;目录前-为1级目录,--为2级以此类推,分隔符亦是如此`n",%iniFile%
    FileAppend,% "cmd.exe`n-`n-app`n计算器|calc.exe`n--img`n  画图|mspaint.exe`n  ---`n  截图|SnippingTool.exe`n--sys`n  ---media`n     wmplayer.exe`n--佳软`n  StrokesPlus.exe`n  TC|Totalcmd64.exe`n  Everything.exe`n-edit`n  notepad.exe`n  写字板|wordpad.exe`n-`nIE(&E)|C:\Program Files\Internet Explorer\iexplore.exe`n-`n设置|Control.exe`n",%iniFile%
    return



附件 缩略图
   
打印这项 推荐给朋友

  智能CapsLock
发布: wck - 2016-09-01 09 : 55 - 回复 (1)

之前在各种地方看到有小伙伴把CapsLock改成修饰键执行一些功能
但是我手笨,同时按俩键就嫌累
所以想能不能设置一个CapsLockMode,打开mode之后执行一些特定功能,关闭则一切恢复正常
这样的好处是本来要连续按CapsLock的操作只需要按一次CapsLock激活mode就行了
非常方便。

智能CapsLock功能设计:
1.单击CapsLock进入CapsLockMode,功能可定制
2.再次单击CapsLock退出模式
3.原有大写锁定功能被我改为快速双击CapsLock了,之后再按一次CapsLock取消锁定。
4.CapsLockMode开的时候屏幕左侧有ToolTip提示。大写锁定开的时候我的笔记本有提示灯所以能看出来

下面的代码中我写了简单的Demo
wasd是鼠标像素移动,可以在截图之类的情景下做鼠标微调
,。也就是<>是选中本行光标左|右的文字
e-r|c-v|1-2是三套独立的剪贴板,左边复制右边粘贴。用的clipboardall所以支持非文本。与系统剪贴板混用会出错,不要混用。
其他好功能设想欢迎分享和自行添加!!

代码:
SetStoreCapslockMode, Off    ;Send后大写锁定键不还原
CoordMode, ToolTip, Screen

CapsLock::    ;CapsLockMode =0|1|2 <=> 未激活|智能CapsLock|大写锁定
KeyWait, CapsLock
if(A_PriorKey="CapsLock" && A_TimeSincePriorHotkey>0 && A_TimeSincePriorHotkey<365){
    CapsLockMode := 2
    SetCapsLockState, On
}else{
    if(CapsLockMode=2)
        CapsLockMode := 0
    else
        CapsLockMode := !CapsLockMode
    SetCapsLockState, Off
}
if(CapsLockMode=1){
    ToolTip, CapsLock Mode, 0, 600, 2
}else{
    ToolTip,,,,2
}
return

#If CapsLockMode=1        ;命令配置开始
;鼠标像素级位移
w::MouseMove,0,-1,,R    ;w::Send, {Up}
a::MouseMove,-1,0,,R    ;a::Send, {Left}
s::MouseMove,0,+1,,R    ;s::Send, {Down}
d::MouseMove,+1,0,,R    ;d::Send, {Right}
;选中光标左右文字
,::Send, +{Home}
.::Send, +{End}
;三套独立剪贴板:e-r|c-v|1-2
e::
Send, ^c
ClipWait, 1, 1
if ErrorLevel        ;防止剪贴板串路
    return
ClipPocket_1 := ClipboardAll
Clipboard =            ;清空剪贴板
return
r::
Clipboard := ClipPocket_1
Send, ^v
Clipboard =            ;清空剪贴板
return
c::
Send, ^c
ClipWait, 1, 1
if ErrorLevel
    return
ClipPocket_2 := ClipboardAll
Clipboard =
return
v::
Clipboard := ClipPocket_2
Send, ^v
Clipboard =
return
1::
Send, ^c
ClipWait, 1, 1
if ErrorLevel
    return
ClipPocket_3 := ClipboardAll
Clipboard =
return
2::
Clipboard := ClipPocket_3
Send, ^v
Clipboard =
return
#If                        ;命令配置结束

打印这项 推荐给朋友

  UrlEncode,UrlDecode
发布: xue_zhe - 2016-07-23 11 : 14 - 无回复

代码:
by xue_zhe
2016.7.22

Msgbox % UrlEncode("测试")
Msgbox % UrlDecode("%E6%B5%8B%E8%AF%95")

UrlEncode(string){
scriptControl := ComObjCreate("ScriptControl")
scriptControl.Language := "JScript"
return scriptControl.Eval("encodeURI('" string "')")
}

UrlDecode(string){
scriptControl := ComObjCreate("ScriptControl")
scriptControl.Language := "JScript"
return scriptControl.Eval("decodeURI('" string "')")
}

打印这项 推荐给朋友

Brick 【键盘党利器LabelControl_vZz】Windows上的vimperator/Pentadactyl
发布: Zz - 2016-06-29 19 : 59 - 回复 (4)

原版的LabelControl是国外大神很久之前的作品,虽很早就有想法改的更实用,但一直搁浅到今……现在利用跳槽的空闲日子终于魔改完成。

最新更新:修复了开启Label后CPU占用较多的问题

[Image: biv790.gif]

[Image: 25z49wi.jpg]

[Image: rlceoz.jpg]



附件
.zip  LabelControl_vZz_键盘党利器.zip (大小: 642.22 KB / 下载: 92)
打印这项 推荐给朋友


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合