Autohotkey 中文论坛
不知哪位高人知道和autohotkey类似的中国版软件 - 可打印的版本

+- Autohotkey 中文论坛 (http://ahkcn.net)
+-- 版块: AutoHotkey (/forum-3.html)
+--- 版块: 软件&资源 (/forum-13.html)
+--- 主题: 不知哪位高人知道和autohotkey类似的中国版软件 (/thread-4006.html)

页: 1 2


不知哪位高人知道和autohotkey类似的中国版软件 - freeman - 2012-03-26 20 : 27

我以前看到过一个软件堪称中国版的Autohotkey或Autoit3,功能和这两个软件极其相似,不知哪位高人知道叫什么名字?


- tcgbp - 2012-03-31 10 : 20

不是按键精灵吧? {:3_46:}


- hitman - 2012-04-07 14 : 34

aauto 快手?


- shakersmile - 2012-04-07 17 : 03

应该说的是快手吧!


- bugmenot - 2012-05-10 22 : 40

同意楼上的,快手确实不错,我试用过,功能什么的都挺强,语法上也接近主流编程语言。
好像快手的前身是“模拟精灵”,当时比2L说的那个还好,可惜推广不力或者是对手的排挤,后来停止开发了,作者又开发出了功能更强的快手,而且其新版本完全免费,比按键好​多了,按键的推广手段真恶心。
国内还有一款脚本工具也不错,叫"脚本大师",老牌了,但可能兼容性和执行效率上有点问题。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - abshuhuhuhu - 2013-08-08 12 : 47

快手好像写起来太麻烦?

我觉得代码最好写的就是autohotkey了,简单的事情,用记事本就搞定了。哈哈


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - tdx190 - 2013-08-10 13 : 29

有意思,AAuto可以嵌入AutoHotkey脚本
PHP 代码:
import win.ui;
/*DSG{{*/
var winform win.formbottom=442;right=610;max=false;text="AAuto调用autohotkey" )
winform.add(
static={ 
bottom=39;text="请在下面输入Autohotkey脚本";left=33;right=198;top=16;z=2;transparent=1;cls="static" };
btnRurn={ bottom=38;right=556;left=405;top=5;z=3;text="运行脚本";cls="button" };
edit={ bottom=425;right=579;left=30;multiline=1;top=43;z=1;text="
Gui, Add, Tab2,, 第一页|第二页|第三页 ; 
Gui, Add, Checkbox, vMyCheckbox, 一个复选框
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, 单选框1
Gui, Add, Radio,, 单选框2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5 ; r5 表示总共有5行
Gui, Tab ; 表示之后创建的控件不属于属性页控件
Gui, Add, Button, default xm, OK ; xm 表示把该控件显示在窗体的左下角
Gui, Show
return
ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit ; 保存每个与控件相关联的变量
MsgBox 你选择了:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp
"
;edge=1;cls="richedit" }
)
/*}}*/

import ahk;
winform.btnRurn.oncommand = function(id,event){
    
ahk.run(winform.edit.text)
}

winform.show()
win.loopMessage(); 

看到一个AAuto自动玩扫雷的代码, 好简洁!

[Image: 12172717_SIsh.gif]

PHP 代码:
import key;
import mouse;
import process;
import winex;
import win.ui;

/*DSG{{*/
var winform win.formtext="AAuto 自动玩扫雷";right=346;bottom=138 )
winform.add
btnCall={ bottom=88;right=291;left=187;top=49;z=2;text="Call自动扫雷";cls="button" };
btnMouse={ bottom=88;right=156;left=52;top=49;z=1;text="鼠标自动扫雷";cls="button" }
)
/*}}*/

var CALLADDR 0x010037E1   //call地址
var DATABASE 0x1005340    //棋盘基址
var SETBASE 0x01005330         //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
var XYBASE 0x01005118                //call参数:XYBASE:x   XYBASE+4:y

sweeper  = function(byMouse){

    var 
prc process("winmine.exe"//创建扫雷进程
    //这里最好指定进程ID,不然会找到你刚发的贴子窗口,因为浏览器标题栏也有"扫雷"这几个字
    
hwnd winex.waitVisible"<扫雷>|<Minesweeper>",,,,,prc.id );  //获取窗口句柄      
    
win.setForeground(hwnd//外部进程最好用这个函数              
    
var x,y,cx,cy=win.getPos(hwnd);    //获取窗口坐标
    
    
var width prc.readNumber(SETBASE+4,"INT")
    var 
height prc.readNumber(SETBASE+8,"INT")
    var 
Act_c prc.remoteApi("void()"CALLADDR);  //获取远程call
    
for(j=1;height){
        for(
i=1;widthbegin
            
var prc.readNumber(DATABASE+i+32*j,"byte")  //棋盘基址+x+y*32=棋盘点的值
            // 未点击时:无雷:0f;;;有雷,8f (有用) 点击后:无雷:4x,x=周围雷的个数;;;有雷8x
            
if(n==0x0f) {
                if(
byMouse){ 
                    
mouse.move(x+4+16*i,y+96+16*j,true);  //移动到坐标点
                    
mouse.click();  
                    
win.delay(10); //加点延时,不然太快完成看不到过程
                
}
                else {
                    
prc.writeNumber(XYBASE,i,"INT")  //写X坐标
                    
prc.writeNumber(XYBASE+4,j,"INT")  //写Y坐标
                    
Act_c();//点击函数
                    
win.delay(100); //加点延时,不然太快完成看不到过程
                
}
            };
        
end;
    }
    
prc.free();  //释放句柄 
}

winform.btnCall.oncommand = function(){
    
sweeper(false)
}
  
winform.btnMouse.oncommand= function(){
    
sweeper(true)
}

winform.show() 
win.loopMessage(); 

下面是autohotkey的扫雷:

PHP 代码:
start:
Process Exist,winmine.exe
pid
:=ErrorLevel
WinGet id
,id,ahk_pid%pid%
WinActivate ahk_pid%pid%
WinWaitActive ahk_pid%pid%
WinGetPos ,,,wl,hl,ahk_pid%pid%
xn:=Round((wl-30)/16)
yn:=Round((hl-115)/16)
m:=xn*yn
CoordMode pixel
,relative
PixelSearch xl1
,xl2,9,hl-50,20,hl-50,0x808080
xl1
+=3
xl2
:=16*xn-1+xl1
;»ñÈ¡Y·½ÏòÉÏ·½¿éÇøÓòµÄ×ܳ¤¶È
PixelSearch 
,,yl2,50,hl-9,50,hl-20,0xFFFFFF
yl2
-=3
yl1
:=yl2-16*yn+1
CoordMode mouse
,relative
offcount
:=0
loop 
%yn%
        {
            
ifoffy:=A_Index
            Loop 
%xn%
            {
                
noff:=ifnoff(A_index,ifoffy)
                If (
noff="off")
                {
                    
offcount++
                }
            }
        }
    If (
offcount =0)
    {
        
MsgBox ,64,Ìáʾ,hidder
        ControlSend 
,,{F2},ɨÀ×
    
}


clickstart:
Random nxrandom,1,xn
Random nyrandom
,1,yn
nrpx
:=xl1+8+16*(nxrandom-1)
nrpy:=yl1+8+16*(nyrandom-1)
ControlClick x%nrpxy%nrpy%,ahk_pid%pid%,,L,,NA

Search
:
done:=0
Loop 
%yn%
{
    
ny:=A_Index
    nvy
:=ny
    Loop 
%xn%
    {
        
nvx:=A_Index
        ny
:=nvy
        nx
:=A_Index
        n
%nx%_%ny%:=number(nx,ny)
        
n:=n%nx%_%ny%
        
nnx:=xl1+8+16*(nx-1)
        
nny:=yl1+8+16*(ny-1)
        if 
n%nx%_%nyis Number
        
{
            
on=0
            off
=0
            flag
=0
            nr
=
            
nrd=
            
nd=
            
nld=
            
nl=
            
nlu=
            
nu=
            
nru=
            
Gosub ntype
        
}
    }
}
If (
done=1)
Gosub search
Else
{
    
offcount:=0
    loop 
%yn%
        {
            
ifoffy:=A_Index
            Loop 
%xn%
            {
                
noff:=ifnoff(A_index,ifoffy)
                If (
noff="off")
                {
                    
offcount++
                    
offx%offcount%:=A_Index
                    offy
%offcount%:=ifoffy
                
}
            }
        }
    If (
offcount =0)
    Exit 
8
    Random nrandom
,1,offcount
    nrpx
:=xl1+8+16*(offx%nrandom%-1)
    
nrpy:=yl1+8+16*(offy%nrandom%-1)
    
ControlClick x%nrpxy%nrpy%,ahk_pid%pid%,,L,,NA
    Gosub search
}
Exit 
4
ntype
:
If (
ny=1) and (nx=1)
{
Gosub noLU
Return
}
If (
ny=1) and (nx<>1) and (nx<>xn)
{
Gosub noU
Return
}
If (
ny=1) and (nx=xn)
{
Gosub noRU
Return
}
If (
ny<>1) and (ny<>yn) and (nx=1)
{
Gosub noL
Return
}
If (
ny<>1) and (ny<>yn) and (nx<>1) and (nx<>xn)
{
Gosub AS
Return
}
If (
ny<>1) and (ny<>yn) and (nx=xn)
{
Gosub noR
Return
}
If (
ny=yn) and (nx=1)
{
Gosub noLD
Return
}
If (
ny=yn) and (nx<>1) and (nx<>xn)
{
Gosub noD
Return
}
If (
ny=yn) and (nx=xn)
{
Gosub noRD
Return
}

Detect:
noLU:
na:=3
nx
++
nr:=Status(nx,ny)
ny++
nrd:=Status(nx,ny)
nx--
nd:=Status(nx,ny)
Gosub Do
Return
noU:
na:=5
nx
++
nr:=Status(nx,ny)
ny++
nrd:=Status(nx,ny)
nx--
nd:=Status(nx,ny)
nx--
nld:=Status(nx,ny)
ny--
nl:=Status(nx,ny)
Gosub Do
Return
noRU:
na:=3
ny
++
nd:=Status(nx,ny)
nx--
nld:=Status(nx,ny)
ny--
nl:=Status(nx,ny)
Gosub Do
Return
noL:
na:=5
nx
++
nr:=Status(nx,ny)
ny++
nrd:=Status(nx,ny)
nx--
nd:=Status(nx,ny)
ny-=2
nu
:=Status(nx,ny)
nx++
nru:=Status(nx,ny)
Gosub Do
Return
AS:
na:=8
nx
++
nr:=Status(nx,ny)
ny++
nrd:=Status(nx,ny)
nx--
nd:=Status(nx,ny)
nx--
nld:=Status(nx,ny)
ny--
nl:=Status(nx,ny)
ny--
nlu:=Status(nx,ny)
nx++
nu:=Status(nx,ny)
nx++
nru:=Status(nx,ny)
Gosub Do
Return
noR:
na:=5
ny
++
nd:=Status(nx,ny)
nx--
nld:=Status(nx,ny)
ny--
nl:=Status(nx,ny)
ny--
nlu:=Status(nx,ny)
nx++
nu:=Status(nx,ny)
Gosub Do
Return
noLD:
na:=3
nx
++
nr:=Status(nx,ny)
nx--
ny--
nu:=Status(nx,ny)
nx++
nru:=Status(nx,ny)
Gosub Do
Return
noD:
na:=5
nx
--
nl:=Status(nx,ny)
ny--
nlu:=Status(nx,ny)
nx++
nu:=Status(nx,ny)
nx++
nru:=Status(nx,ny)
ny++
nr:=Status(nx,ny)
Gosub Do
Return
noRD:
na:=3
nx
--
nl:=Status(nx,ny)
ny--
nlu:=Status(nx,ny)
nx++
nu:=Status(nx,ny)
Gosub Do
Return
Status(nx,ny)
{
    global
    
px:=xl1+1+16*(nx-1)
    
py:=yl1+1+16*(ny-1)
    
CoordMode pixel,relative
    PixelGetColor 
,color,px,py
    
if (color=0xFFFFFF)
    {
        
PixelGetColor color1,xl1+7+16*(nx-1),yl1+5+16*(ny-1)
        
PixelGetColor color2,xl1+8+16*(nx-1),yl1+11+16*(ny-1)
        If (
color1=0x0000FF) and (color2=0x000000)
        {
            
flag++
            Return 
"flag"
        
}
        Else
        {
            
off++
            
off%off%x:=xl1+8+16*(nx-1)
            
off%off%y:=yl1+8+16*(ny-1)
            Return 
"off"
        
}
    }
    Else
    {
        
on++
        Return 
"on"
    
}
}
Number(nx,ny)
{
global 
xl1,yl1
py
:=yl1+8+16*(ny-1)
px:=xl1+8+16*(nx-1)
CoordMode pixel,relative
PixelGetColor color
,px,py
if (color=0xFF0000)
Return 
1
if (color=0x008000)
Return 
2
if (color=0x0000FF)
Return 
3
if (color=0x800000)
Return 
4
if (color=0x000080)
Return 
5
if (color=0x808000)
Return 
6
if (color=0x000000)
{
    
PixelGetColor color,px-1,py-1
    
if (color=0xFFFFFF)
    {
        
PixelGetColor color1,xl1+7+15*(nx-1),yl1+5+15*(ny-1)
        
PixelGetColor color2,xl1+8+15*(nx-1),yl1+11+15*(ny-1)
        If (
color1=0x0000FF) and (color2=0x000000)
        Return 
"flag"
        
Else
        {
            
ControlSend ,,{F2},ɨÀ×
            Gosub search
        
}
    }
}
If (
color=0xC0C0C0)
{
    
PixelGetColor color7,px+1,py+1
    
If (color7=0x000000)
    Return 
7
}
if (
color=0x808080)
Return 
8
}
Do:
If (
n=na-on) and (flag<>n)
{
    
Gosub flag
    done
:=1
}

If (
n=flag) and (off 0)
{
    
Gosub Dig
    done
:=1
}
Return
Dig:
ControlClick x%nnxy%nny%,ahk_pid%pid%,,M,,NA
Return
Flag:

Loop %off%
{
    
flagx:=off%A_Index%x
    flagy
:=off%A_Index%y
    ControlClick x
%flagxy%flagy%,ahk_pid%pid%,,R,,NA
}
Return
ifnoff(xn,yn)
{
    global 
xl1,yl1
    py
:=yl1+8+16*(yn-1)
    
px:=xl1+8+16*(xn-1)
    
CoordMode pixel,relative
    PixelGetColor color
,px,py
    
if (color=0xC0C0C0)
    {
        
PixelGetColor color,px-7,py-7
        
If (color=0xFFFFFF)
        Return 
"off"
    
}




RE: 不知哪位高人知道和autohotkey类似的中国版软件 - fengshi0519 - 2013-08-21 09 : 01

记得以前有个可以在qq游戏自动玩连连看的,找不到了


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - overpan - 2013-09-17 09 : 55

(2012-05-10 22 : 40)bugmenot 提到:  同意楼上的,快手确实不错,我试用过,功能什么的都挺强,语法上也接近主流编程语言。
好像快手的前身是“模拟精灵”,当时比2L说的那个还好,可惜推广不力或者是对手的排挤,后来停止开发了,作者又开发出了功能更强的快手,而且其新版本完全免费,比按键好​多了,按键的推广手段真恶心。
国内还有一款脚本工具也不错,叫"脚本大师",老牌了,但可能兼容性和执行效率上有点问题。
快手作者很偏激的,唉,不提也罢,免得心烦,他技术倒很棒.


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - tdx190 - 2013-09-30 23 : 47

(2013-09-17 09 : 55)overpan 提到:  
(2012-05-10 22 : 40)bugmenot 提到:  同意楼上的,快手确实不错,我试用过,功能什么的都挺强,语法上也接近主流编程语言。
好像快手的前身是“模拟精灵”,当时比2L说的那个还好,可惜推广不力或者是对手的排挤,后来停止开发了,作者又开发出了功能更强的快手,而且其新版本完全免费,比按键好​多了,按键的推广手段真恶心。
国内还有一款脚本工具也不错,叫"脚本大师",老牌了,但可能兼容性和执行效率上有点问题。
快手作者很偏激的,唉,不提也罢,免得心烦,他技术倒很棒.
对一个免费软件不喜欢不用就是了不至于、也不值得去心烦的。这个急功近利的时代能去做点东西又愿意免费分享的不多了,从模拟精灵到快手七八年了一直是免费的、一边用一边骂​的多也没看快手作者得到什么好名声,但人家一直在免费的为大家服务着,不要整天只看到别人黑暗的一面,如果让你去做同样的事也许喷你的人更多,所以宽容一些、开心一心,没​必要去烦。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - @@@ - 2013-10-05 11 : 00

Autohotkey 真是神一样的软件,居然可以嵌入其他编程语言


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - a500 - 2013-10-08 11 : 42

国产软件,无条件支持一个


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - 兔子 - 2013-10-11 16 : 42

以为快手支持AHK,结果运行了7楼那段快手代码后,发现就是调用AHK.DLL文件来运行AHK代码。
最诡异的是,ahk.run() 这玩意,不管是AHK那里,还是快手那里,没有任何地方有任何说明。
而且,也没法和快手本身进行交互。

严重怀疑是改了ahk_h的dll文件,可惜是两年前的版本了……


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - tdx190 - 2013-10-14 12 : 35

(2013-10-11 16 : 42)849112292 提到:  以为快手支持AHK,结果运行了7楼那段快手代码后,发现就是调用AHK.DLL文件来运行AHK代码。
最诡异的是,ahk.run() 这玩意,不管是AHK那里,还是快手那里,没有任何地方有任何说明。
而且,也没法和快手本身进行交互。

严重怀疑是改了ahk_h的dll文件,可惜是两年前的版本了……

快手里的ahk.dll 就是原版的 ahk.dll ,版本说明里不是写了 AutoHotkey_H 1.1 么,这个不是官网的最新稳定版? 其他编程语言要支持ahk肯定要用他的dll啊。

ahk.run() 很简单就是运行ahk脚本,
输入 ahk.run( 就看到代码提示里的参数说明了。
可以在扩展库里看 ahk.run 函数的源码,调用的 ahktextdll,官网也有说明文档

ahk 可以跟快手交互的,ahk.assign() 修改ahk变量的值,ahk.getvar() 获取变量的值,ahk.function() 调用函数 ,ahk. 输入看代码提示的函数列表,都有说明的。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - 兔子 - 2013-10-15 11 : 06

(2013-10-14 12 : 35)tdx190 提到:  
(2013-10-11 16 : 42)849112292 提到:  以为快手支持AHK,结果运行了7楼那段快手代码后,发现就是调用AHK.DLL文件来运行AHK代码。
最诡异的是,ahk.run() 这玩意,不管是AHK那里,还是快手那里,没有任何地方有任何说明。
而且,也没法和快手本身进行交互。

严重怀疑是改了ahk_h的dll文件,可惜是两年前的版本了……

快手里的ahk.dll 就是原版的 ahk.dll ,版本说明里不是写了 AutoHotkey_H 1.1 么,这个不是官网的最新稳定版? 其他编程语言要支持ahk肯定要用他的dll啊。

ahk.run() 很简单就是运行ahk脚本,
输入 ahk.run( 就看到代码提示里的参数说明了。
可以在扩展库里看 ahk.run 函数的源码,调用的 ahktextdll,官网也有说明文档

ahk 可以跟快手交互的,ahk.assign() 修改ahk变量的值,ahk.getvar() 获取变量的值,ahk.function() 调用函数 ,ahk. 输入看代码提示的函数列表,都有说明的。

首先,我上次回帖时,自动下载下来的AHK库文件,就只有一个AHK.DLL文件,并且版本是2年前的……
今天忽然变成1.1.13.0的了……

我本身是AAU和AHK都在用,能够在一方中使用另一方,当然是很爽的事情。

问题是,我还是不明白,AHK.RUN()这个函数,是写在哪个文件中的?我翻遍了AAU的目录,尤其是LIB目录,就只有一个AHK.DLL文件,完全没找到记载AHK​.RUN()的文件。

我知道输入AHK.RUN( 可以看见智能提示,但是这些提示,都太模糊了,我想看代码怎么写的,我才能知道怎么用。

我咧个娘,还真是改了DLL,直接写在DLL里面的………………………………………… 一千万头草泥马开始狂奔…………………………………………


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - 兔子 - 2013-10-15 13 : 38

(2013-10-14 12 : 35)tdx190 提到:  
(2013-10-11 16 : 42)849112292 提到:  以为快手支持AHK,结果运行了7楼那段快手代码后,发现就是调用AHK.DLL文件来运行AHK代码。
最诡异的是,ahk.run() 这玩意,不管是AHK那里,还是快手那里,没有任何地方有任何说明。
而且,也没法和快手本身进行交互。

严重怀疑是改了ahk_h的dll文件,可惜是两年前的版本了……

快手里的ahk.dll 就是原版的 ahk.dll ,版本说明里不是写了 AutoHotkey_H 1.1 么,这个不是官网的最新稳定版? 其他编程语言要支持ahk肯定要用他的dll啊。

ahk.run() 很简单就是运行ahk脚本,
输入 ahk.run( 就看到代码提示里的参数说明了。
可以在扩展库里看 ahk.run 函数的源码,调用的 ahktextdll,官网也有说明文档

ahk 可以跟快手交互的,ahk.assign() 修改ahk变量的值,ahk.getvar() 获取变量的值,ahk.function() 调用函数 ,ahk. 输入看代码提示的函数列表,都有说明的。

代码:
import win.ui;
/*DSG{{*/
var winform = win.form( bottom=442;right=610;max=false;text="AAuto调用autohotkey" )
winform.add(
static={ bottom=39;text="请在下面输入Autohotkey脚本";left=33;right=198;top=16;z=2;transparent=1;cls="static" };
btnRurn={ bottom=38;right=556;left=405;top=5;z=3;text="运行脚本";cls="button" };
edit={ bottom=425;right=579;left=30;multiline=1;top=43;z=1;text="
text=这是一个测试变量,用于测试是否能被外部获取
Gui, Add, Tab2,, 第一页|第二页|第三页 ;
Gui, Add, Checkbox, vMyCheckbox, 一个复选框
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, 单选框1
Gui, Add, Radio,, 单选框2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5 ; r5 表示总共有5行
Gui, Tab ; 表示之后创建的控件不属于属性页控件
Gui, Add, Button, default xm, OK ; xm 表示把该控件显示在窗体的左下角
Gui, Show
return
ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit ; 保存每个与控件相关联的变量
MsgBox 你选择了:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp
";edge=1;cls="richedit" }
)
/*}}*/


import ahk;
winform.btnRurn.oncommand = function(id,event){
    ahk.run(winform.edit.text)
io.open()
io.print("您输入的是" ,ahk.getvar("test",0) );
}

winform.show()
win.loopMessage();
以上AAU代码,经测试无法从AAU中获取AHK的变量值。
请教,如何在AAU中获取并设置AHK中的变量,数组,对象 3种东西的值?
能否给个简单的示例???
谢谢

另外,AAU调用AHK的DLL,是各种崩溃…… 就上面那个代码,多运行几次,就会崩溃……



RE: 不知哪位高人知道和autohotkey类似的中国版软件 - tdx190 - 2013-10-16 00 : 07

取不到变量,是因为你变量名写错了:
text
test


你上面发的代码试了几次没发现崩溃。
这aauto只是做一个简单的DLL调用,运行代码的是 autohotkey,
autohotkey应当不会这么弱不经风吧?!

aauto 并没有修改ahk.dll, 因为我试过自己替换官方dll一样能使用,
扩展库在资源文件里(也可以放DLL外面,参考AAuto手册),其实就几句代码我是觉得没什么复杂的,说什么一万个草泥马就没必要了,
你要觉得麻烦那就别折腾了,其他问题就别问我,我只是个菜鸟。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - 兔子 - 2013-10-16 10 : 14

(2013-10-16 00 : 07)tdx190 提到:  取不到变量,是因为你变量名写错了:
text
test


你上面发的代码试了几次没发现崩溃。
这aauto只是做一个简单的DLL调用,运行代码的是 autohotkey,
autohotkey应当不会这么弱不经风吧?!

aauto 并没有修改ahk.dll, 因为我试过自己替换官方dll一样能使用,
扩展库在资源文件里(也可以放DLL外面,参考AAuto手册),其实就几句代码我是觉得没什么复杂的,说什么一万个草泥马就没必要了,
你要觉得麻烦那就别折腾了,其他问题就别问我,我只是个菜鸟。

变量问题昨天发现了。

扩展库为了省一个 .res 目录,所以写在DLL的资源文件中,方不方便更新先不说,让不是特别清楚的人,把时间浪费在诸如,为什么别的库可以直接看见源码,这个不行?这个库怎么就一个DLL文件,​源码到底写在哪里?这是让我草泥马狂奔的原因。

崩溃问题,经测试,是AHK本身问题。AHK确实强壮,不过如果使用多线程并编译,呵呵……

有兴趣可以搜搜。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - tdx190 - 2013-10-16 16 : 18

(2013-10-16 10 : 14)849112292 提到:  变量问题昨天发现了。
扩展库为了省一个 .res 目录,所以写在DLL的资源文件中,方不方便更新先不说,让不是特别清楚的人,把时间浪费在诸如,为什么别的库可以直接看见源码,这个不行?这个库怎么就一个DLL文件,​源码到底写在哪里?这是让我草泥马狂奔的原因。

崩溃问题,经测试,是AHK本身问题。AHK确实强壮,不过如果使用多线程并编译,呵呵……
有兴趣可以搜搜。

.res目录这些我还真没注意过,看得出你对aauto非常熟悉啊,分析能力细致入微真不错,向你学习了。

不过AAuto帮助文档中有关于dll库的说明:
引用:dll库:可以在标准dll的资源文件(资源类型名字"LIB",资源名字"IMPORT" )中添加AAuto代码、以支持import语句。在AAuto代码中可以声明dll的API函数,并进行封装优化。

感觉这个功能还是挺方便的,直接用DLL文件就可以作为AAuto的库模块使用,也不用改变标准DLL原来的功能。

ahk.run() 这个函数在AAuto IDE里的使用说明是这样的:
引用:ahk.run(脚本,"/Debug",其他参数)
运行ahk脚本,第二第三个参数可省略
第一个参数可以是脚本代码,也可以是脚本文件路径
返回线程句柄

ahk.run() 函数的 AAuto源码
PHP 代码:
run = function(file,argv="",argc=""){
    if(..
io.exist(file) ){
        return 
ahkdll(file,argv,argc)
    }
    else {
        
file #file<0x104/*_MAX_PATH*/ ? ..string.load(file) : file;
        
return ahktextdll(file,argv,argc
    } 

可以看出如果参数是AHK脚本就调用 ahktextdll() 函数,如果是文件就调用 ahkdll() 函数,

这是autohotkey.dll 帮助文档里的对ahktextdll() 的说明
引用:Parameters passed to dll.
These will be handled same way as done in AutoHotkey.exe. E.g. when you Run myscript.exe “parameters”
ahkdll returns a thread handle.
希望上面提供的信息对你有所帮助。

关于你说的崩溃问题, 你前面发的代码,我现在改用公司的电脑试了下,狂点了几十次运行也没有崩溃,当然可能是我的操作不正确、或者是我的系统原因。


RE: 不知哪位高人知道和autohotkey类似的中国版软件 - 兔子 - 2013-10-16 16 : 54

(2013-10-16 16 : 18)tdx190 提到:  
(2013-10-16 10 : 14)849112292 提到:  变量问题昨天发现了。
扩展库为了省一个 .res 目录,所以写在DLL的资源文件中,方不方便更新先不说,让不是特别清楚的人,把时间浪费在诸如,为什么别的库可以直接看见源码,这个不行?这个库怎么就一个DLL文件,​源码到底写在哪里?这是让我草泥马狂奔的原因。

崩溃问题,经测试,是AHK本身问题。AHK确实强壮,不过如果使用多线程并编译,呵呵……
有兴趣可以搜搜。

.res目录这些我还真没注意过,看得出你对aauto非常熟悉啊,分析能力细致入微真不错,向你学习了。

不过AAuto帮助文档中有关于dll库的说明:
引用:dll库:可以在标准dll的资源文件(资源类型名字"LIB",资源名字"IMPORT" )中添加AAuto代码、以支持import语句。在AAuto代码中可以声明dll的API函数,并进行封装优化。

感觉这个功能还是挺方便的,直接用DLL文件就可以作为AAuto的库模块使用,也不用改变标准DLL原来的功能。

ahk.run() 这个函数在AAuto IDE里的使用说明是这样的:
引用:ahk.run(脚本,"/Debug",其他参数)
运行ahk脚本,第二第三个参数可省略
第一个参数可以是脚本代码,也可以是脚本文件路径
返回线程句柄

ahk.run() 函数的 AAuto源码
PHP 代码:
run = function(file,argv="",argc=""){
    if(..
io.exist(file) ){
        return 
ahkdll(file,argv,argc)
    }
    else {
        
file #file<0x104/*_MAX_PATH*/ ? ..string.load(file) : file;
        
return ahktextdll(file,argv,argc
    } 

可以看出如果参数是AHK脚本就调用 ahktextdll() 函数,如果是文件就调用 ahkdll() 函数,

这是autohotkey.dll 帮助文档里的对ahktextdll() 的说明
引用:Parameters passed to dll.
These will be handled same way as done in AutoHotkey.exe. E.g. when you Run myscript.exe “parameters”
ahkdll returns a thread handle.
希望上面提供的信息对你有所帮助。

关于你说的崩溃问题, 你前面发的代码,我现在改用公司的电脑试了下,狂点了几十次运行也没有崩溃,当然可能是我的操作不正确、或者是我的系统原因。
AAU 和 AHK 都挺好的。
现在还能直接混合编程了,挺爽的。
谢谢~

(2013-10-16 16 : 18)tdx190 提到:  
(2013-10-16 10 : 14)849112292 提到:  变量问题昨天发现了。
扩展库为了省一个 .res 目录,所以写在DLL的资源文件中,方不方便更新先不说,让不是特别清楚的人,把时间浪费在诸如,为什么别的库可以直接看见源码,这个不行?这个库怎么就一个DLL文件,​源码到底写在哪里?这是让我草泥马狂奔的原因。

崩溃问题,经测试,是AHK本身问题。AHK确实强壮,不过如果使用多线程并编译,呵呵……
有兴趣可以搜搜。

.res目录这些我还真没注意过,看得出你对aauto非常熟悉啊,分析能力细致入微真不错,向你学习了。

不过AAuto帮助文档中有关于dll库的说明:
引用:dll库:可以在标准dll的资源文件(资源类型名字"LIB",资源名字"IMPORT" )中添加AAuto代码、以支持import语句。在AAuto代码中可以声明dll的API函数,并进行封装优化。

感觉这个功能还是挺方便的,直接用DLL文件就可以作为AAuto的库模块使用,也不用改变标准DLL原来的功能。

ahk.run() 这个函数在AAuto IDE里的使用说明是这样的:
引用:ahk.run(脚本,"/Debug",其他参数)
运行ahk脚本,第二第三个参数可省略
第一个参数可以是脚本代码,也可以是脚本文件路径
返回线程句柄

ahk.run() 函数的 AAuto源码
PHP 代码:
run = function(file,argv="",argc=""){
    if(..
io.exist(file) ){
        return 
ahkdll(file,argv,argc)
    }
    else {
        
file #file<0x104/*_MAX_PATH*/ ? ..string.load(file) : file;
        
return ahktextdll(file,argv,argc
    } 

可以看出如果参数是AHK脚本就调用 ahktextdll() 函数,如果是文件就调用 ahkdll() 函数,

这是autohotkey.dll 帮助文档里的对ahktextdll() 的说明
引用:Parameters passed to dll.
These will be handled same way as done in AutoHotkey.exe. E.g. when you Run myscript.exe “parameters”
ahkdll returns a thread handle.
希望上面提供的信息对你有所帮助。

关于你说的崩溃问题, 你前面发的代码,我现在改用公司的电脑试了下,狂点了几十次运行也没有崩溃,当然可能是我的操作不正确、或者是我的系统原因。

补充下关于崩溃吧。

我自己今天测试以上代码,也没崩溃了……

之所以判断是AHK本身的问题,理由如下。

代码:
/*
ahk_h的正确安装方法,以ahk_l 32位 unicode 版本为例
1. 安装ahk_l
2. 下载ahk_h http://www.autohotkey.net/~HotKeyIt/AutoHotkey.zip
3. 将必要的文件解压并覆盖到ahk_l安装目录,它们是
“lib”文件夹
“Compiler”文件夹
“win32w”文件夹中的“AutoHotkey.exe”
“win32w”文件夹中的“AutoHotkeySC.bin”(覆盖到“ahk_l安装目录”的“Compiler”文件夹中)
“win32w”文件夹中的“AutoHotkey.dll”,“AutoHotkeyMini.dll”(放在自己脚本所在目录)

最大的问题是,以下代码直接运行正常,编译后运行就出错!!!!!!
*/
Loop,4
  {
    var%A_Index%:=[]  ;创建4个外部数组,用于之后各线程操作,然后返回给主线程,可以理解为共用变量。之所以不用ahkgetvar,因为ahkgetvar只能获取变量,不能获​​取数组(对象?)。之所以不用CriticalObject(),因为它无法释放内存
    AhkThRead%A_Index% := AhkDllThRead(A_ScriptDir . "\AutoHotkeyMini.dll")  ;创建线程。若不指定路径,则AutoHotkeyMini.dll要放在自己脚本所在目录
  }
AhkThRead1.ahktextdll("Alias(new1," GetVar(var1) ")`nloop,500000`nnew1.Insert(A_Index)")  ;ahkExec和ahktextdll的区别类似与RunWait和Run的区别
AhkThRead2.ahktextdll("Alias(new2," GetVar(var2) ")`nloop,500000`nnew2.Insert(A_Index)")  ;虽然名字变了,var2变成了new2,但其实它们操作的是同一处的数据,所以当var2的值改变时new2的值也就变了。只不过主线程只能读取var2,线​​程只能读取new2
AhkThRead3.ahktextdll("Alias(new3," GetVar(var3) ")`nloop,500000`nnew3.Insert(A_Index)")  ;需要注意的是,被双引号引起来的东西,会直接计算它的值再传进去,例如这里就是GetVar(var3)的返回值传入函数,而不是“GetVar(var3)​​”这个字符串传入了函数
AhkThRead4.ahktextdll("Alias(new4," GetVar(var4) ")`nloop,500000`nnew4.Insert(A_Index)")

Loop
    ToolTip,% var1.maxindex()+var2.maxindex()+var3.maxindex()+var4.maxindex()  ;这里显示的是var1+var2+var3+var4的总元素数量,此时可以打开任务管理器,看看内存是不是一直在增,最后会增加到40M左右
Return

Esc::
  MsgBox,看看内存占用!
  Loop,4
      var%A_Index%:=""  ;清空变量,释放变量占用的内存
  MsgBox,再看看内存占用!
  ExitApp
Return
以上代码,非编译状态下,运行正常。编译后,一定出错。
事实上,只要是用 AhkDllThRead() 创建线程,编译状态下,就一定出错。