【鼠标键盘录像机】 v2.1

来源:互联网 发布:有声漫画软件 编辑:程序博客网 时间:2024/04/28 17:08

这是一个简单的鼠标键盘录像机,比 AHK 自带的 AutoScriptWriter.exe 好用些。

;--------------------------------------;  【鼠标键盘录像机】 v2.1  By FeiYue;;  此脚本属于傻瓜型自动化脚本生成器,比;  AHK自带的 AutoScriptWriter.exe 好用些;;  使用说明:;;  1、录像时点击或拖动迷你窗口不会被记录;;  2、自动记录鼠标、键盘操作和当前窗口;;  3、单击左下角Ctrl键可以记录鼠标移动;;  4、若要使用绝对坐标,可将脚本自动执行;     段中两处 ;CoordMode, Mouse 分号取消;--------------------------------------#NoEnvSuspend, OnMenu, Tray, AddMenu, Tray, Add, 显示隐藏窗口Menu, Tray, Default, 显示隐藏窗口Menu, Tray, Click, 1;---------------------Gui, +LastFound +AlwaysOnTop -MinimizeBox +Owner  +Hwndgui_id +E0x08000000Gui, Margin, 20, 20Gui, Font, s12Gui, Add, Button, g开始或暂停录像, 开始|暂停Gui, Add, Button, x+0 g查看及修改记录, 查看Gui, Add, Button, x+0 g保存脚本, 保存Gui, Add, Button, x+0 g运行脚本, 运行Gui, Show, NA, 鼠标键盘录像机OnMessage(0x201, "WM_LBUTTONDOWN"); 取消这两处的分号可以记录绝对坐标;CoordMode, MouseRunFileAdd := ";CoordMode, Mouse"ReturnWM_LBUTTONDOWN()  ; 迷你窗口的空白位置也可拖动{  ListLines, Off  if (A_Gui=1 and A_GuiControl="")    PostMessage, 0xA1, 2}GuiClose:Gui, Hideif !A_IsSuspended  Gosub, 开始或暂停录像Return显示隐藏窗口:IfWinExist, ahk_id %gui_id%  Gosub, GuiCloseelse  Gui, Show, NAReturn开始或暂停录像:SuspendSetHotkey(!A_IsSuspended)SetTimer, 抓取当前窗口, % !A_IsSuspended ? 100:"Off", -10Gui, Show, NA, % "鼠标键盘录像机"  . (!A_IsSuspended ? "【录像中】":"")Return抓取当前窗口:ListLines, OffCriticalif (MouseOnGui) and GetKeyState("LButton","P")  ReturnMouseGetPos,,, mouse_idMouseOnGui:=(mouse_id=gui_id)if !MouseOnGui{  id:=WinExist("A")  if (id=oldid)    Return  WinGetTitle, tt  WinGetClass, tc  if (tt="" and tc="")    Return  oldid:=id  WinGetText, txt  tx:="", len:=0  Loop, Parse, txt, `n, `r    if StrLen(v:=Trim(A_LoopField))>len      tx:=v, len:=StrLen(v)  IfWinNotExist, ahk_id %id%, %tx%    tx=  ; 截短标题及文本,并纠正Ansi版失误  tt:=cut(tt), tx:=cut(tx)  ; 代码化修正标题及文本  tt:=zhuanyi(tt), tx:=zhuanyi(tx)  tt.=tc="" ? "" : " ahk_class " tc  tt.=tx="" ? "" : """, % """ tx  log(), logs.="WinWait, % """ tt """`nIfWinNotActive"    . ",,, WinActivate`nWinWaitActive`nSleep, 500`n"}Returncut(s,n=50) {  s:=SubStr(s,1,50)  Gui, 22:Destroy  Gui, 22:Add, Edit  GuiControl, 22:, Edit1, %s%  GuiControlGet, r, 22:, Edit1  Gui, 22:Destroy  Return, r=s ? s : SubStr(s,1,-1)}zhuanyi(s) {  s:=RegExReplace(s,"[``""]","$0$0")  Return, StrReplace(s,";","```;")}查看及修改记录:  ; 可查看、修改当前记录和运行脚本Suspend, Permitif !A_IsSuspended  Gosub, 开始或暂停录像log()Gui, +DisabledGui, 11:DestroyGui, 11:+LastFound +AlwaysOnTop -MinimizeBox +Owner1Gui, 11:Font, s12 cBlueGui, 11:Add, Button, w250 gChangeGui, 11:Add, Button, x+0 wp gViewGui, 11:Add, Button, x+0 wp gClear, 清空(可恢复)Gui, 11:Add, Edit, xm w750 h500 HScroll -WrapGui, 11:Show,, 查看及修改【当前记录】Gui, 11:DefaultGosub, ViewGui, 1:DefaultWinWaitClose, % "ahk_id " WinExist()Gui, 11:DestroyGui, -DisabledReturnChange:GuiControlGet, r,, Button1if InStr(r,"当前记录"){  GuiControlGet, logs,, Edit1  oldid:=logs="" ? "":oldid}else{  GuiControlGet, s,, Edit1  f=%A_Temp%\~test1.tmp  FileDelete, %f%  FileAppend, %s%, %f%  s=}Gui, HideReturnView:GuiControlGet, r,, Button1if InStr(r,"当前记录"){  f=%A_Temp%\~test1.tmp  FileRead, s, %f%  GuiControl,, Button1, 保存运行脚本的修改  GuiControl,, Button2, 运行脚本—>当前记录  Gui, Show,, 查看及修改【运行脚本】}else{  s:=logs  GuiControl,, Button1, 保存当前记录的修改  GuiControl,, Button2, 当前记录—>运行脚本  Gui, Show,, 查看及修改【当前记录】}GuiControl,, Edit1, %s%GuiControl, Focus, Edit1s=ReturnClear:GuiControlGet, s,, Edit1if s=  s:=clearselse  clears:=s, s:=""GuiControl,, Edit1, %s%GuiControl, Focus, Edit1s=Return保存脚本:  ; 保存当前记录到运行脚本,并清空记录Suspend, Permitif !A_IsSuspended  Gosub, 开始或暂停录像Gui, +OwnDialogsMsgBox, 4100, 确认替换  , 要保存当前记录到运行脚本吗?`n`n可以先查看、修改当前记录。Gui, HideGui, Show, NAIfMsgBox, Yes  log()else Returnf=%A_Temp%\~test1.tmp  ; 回放的脚本可以按【Pause】暂停logs:="#NoEnv`n#SingleInstance force`n" RunFileAdd  . "`n`n" logs "`nReturn`n`nPause:: Pause`n"FileDelete, %f%FileAppend, %logs%, %f%logs:=oldid:=""Return运行脚本:  ; 运行上次保存的运行脚本Suspend, Permitif !A_IsSuspended  Gosub, 开始或暂停录像f=%A_Temp%\~test1.tmpIfExist, %f%  Run, %A_AhkPath% /r /f "%f%",, UseErrorLevelReturn;----------------------------------SetHotkey(f:=1) {  ; 设定所有热键  static allkeys, filter:=""  ; 可以过滤已使用的热键,以逗号分隔  if allkeys=  {    ; 过滤会与LShift、LControl、LAlt等冲突的    s:="|Shift|Control|Alt||"    ; 补上主键盘与小键盘虚拟按键码相同导致遗漏的    s.="|Home|End|PgUp|PgDn|Left|Right|Up|Down|Ins|Del|NumpadEnter|"    Loop, 254 {      k:=GetKeyName("vk" . Format("{:02X}",A_Index))      if StrLen(k)=1        StringLower, k, k      s.=InStr(s,"|" k "|") ? "" : k "|"    }    s:=Trim(SubStr(s,InStr(s,"||")),"|")    allkeys:=RegExReplace(s,"Control","Ctrl")  }  f:=f ? "On":"Off"  Loop, Parse, allkeys, |   ; if A_LoopField not in %filter%      Hotkey, ~*%A_LoopField%, LogKey, %f% UseErrorLevel}LogKey:  ; 响应热键IfEqual, MouseOnGui, 1, ReturnCriticalk:=SubStr(A_ThisHotkey,3); 这些键采用独立标签可以避免多线程变量污染if k contains Shift,Ctrl,Alt,Win,Button  if IsLabel(k)    Goto, %k%; 处理QQ中文输入法自动发送左右键来调整光标的情况if (k="NumpadLeft"||k="NumpadRight") and !GetkeyState(k,"P")  Returnlog(k="``"||k=";" ? "```" k : StrLen(k)=1 ? k : "{" k "}")ReturnLShift:RShift:LCtrl:  ; 单击左下角Ctrl键,可以记录鼠标移动RCtrl:LAlt:RAlt:LWin:RWin:log("{" k " Down}")Critical, OffKeyWait, %A_ThisLabel%Criticalk:=A_ThisLabellog("{" k " Up}")if (k="LCtrl") and InStr(A_ThisHotkey,k){  MouseGetPos, mx, my  logs.="`nSleep, 100`nMouseMove, "    . mx ", " my "`nSleep, 100`n"  re:="i)Send, \{LCtrl Down\}(`nSleep, 100`n"    . "Send, )?\{LCtrl Up\}`nSleep, 100`n"  logs:=RegExReplace(logs,re)}ReturnLButton:RButton:MButton:MouseGetPos, mx, my  ; 按下时可采用相对坐标CoordMode, MouseMouseGetPos, %k%x, %k%y%k%x-=mx, %k%y-=mylog("MouseClick, " SubStr(k,1,1) ", " mx ", " my ",,, D")Critical, OffKeyWait, %A_ThisLabel%Criticalk:=A_ThisLabelMouseGetPos, mx, my  ; 松开时采用绝对坐标,以免窗口有变化mx-=%k%x, my-=%k%ylog("MouseClick, " SubStr(k,1,1) ", " mx ", " my ",,, U")Returnlog(k:="") {  ; 记录函数  global logs  s:=SubStr(logs,InStr(logs,"`n",0,0)+1)  ; 获取末行数据  if k=  ; 添加延时  {    SetTimer, SendOK, Off    logs.= s="" ? "" : "`nSleep, 100`n"  }  else if InStr(k,"MouseClick")  ; 原地点击则合并按下弹起  {    StringSplit, a, s, `,, %A_Space%    StringSplit, b, k, `,, %A_Space%    if InStr(s,"MouseClick")=1 and (a7="D" and b7="U")      and (a2=b2) and Abs(a3-b3)+Abs(a4-b4)< 5        logs:=SubStr(logs,1,-5) "`nSleep, 100`n"    else      log(), logs.=k  }  else  {    if InStr(s,"Send")=1 and StrLen(s)< 50      logs.=k    else      log(), logs.="Send, " k    SetTimer, SendOK, 1000  }  Return  SendOK:  log()  Return};------------ 脚本结束 ------------;
原创粉丝点击