aardio软件开发上位机学习笔记2

1、成员变量

成员变量是属于一个名字空间的成员对象。
变量的默认名字空间为global名字空间,并可以使用namespace改变指定代码块的名字空间。
可以使用self关键字访问当前名字空间。使用..操作符访问global名字空间

//没有用var语句显式声明的变量,默认就是当前名字空间的成员变量

变量 = "字符串:普通变量";
变量 = "变量的值是可以改变的" 

..str = 123; //..str等价于 ..global.str


已邀请:

admin

赞同来自:

while var 条件循环语句

while var 语句类似while语句,但可以条件判断前添加循环变量初始化、判断条件前执行语句。

语法如下:

while( var 初始化循环变量列表;判断条件前执行语句;条件判断语句 ) {  
  //需要循环执行的语句
}

示例代码:

io.open()

while( 
    var next,line = io.lines("~\lib\console\_.aardio"); //在循环开始前初始化局部变量
    line = next(); //语句或语句块,可省略不写,但不能省略分号
    line //循环条件表达式,不可省略
){  
    io.print(  line );  
};


admin

赞同来自:

namespace update{
import win;
import fsys;
import process;
import inet.downBox;
import inet.http;

string = ..string;
table = ..table;
io = ..io;
time = ..time;

if( _STUDIO_INVOKED ){
import ide
}
projectDir = _STUDIO_INVOKED == "thread" ? ide.getProjectDir() : "\";

//获取当前版本号
getVersion = function(res = "res"){
if( !_STUDIO_INVOKED ){
return string.load("\" ++ res ++ "\version.txt"); 
}
var file = res ++ "\version.txt";

var version = string.load(projectDir ++ file):""
if(version == ""){
version = "1.0.02";
string.save(projectDir + file, version);
}
return calVersion(version,-1),file; 
};

//计算版本号增加或减少
calVersion = function(version,n=1){
version = string.replace(version,"\.","");
version = tostring((tonumber(version)) + n);//版本号加n,下次发布用
major,minor,build = string.sub(version,-#Ver,-4),string.sub(version,-3,-3),string.sub(version,-2,-1);
version = major + "." + minor + "." + build;
return version; 
}

saveNextVersion = function(res = "res"){
if(_STUDIO_INVOKED){
var version,file = getVersion(res);//版本号 
version = calVersion(version,2);//下个版本
string.save(projectDir + file, version)
}
};

updateWeb = function(exeName,res = "res"){
if(_STUDIO_INVOKED){
var updateDir = projectDir + "Publish\update\";
fsys.createDir(updateDir)
var html = "ver=[%s]" + '\r\n' + "log=[" + '\r\n' + "%s" + '\r\n' + "]" + '\r\n';
var version = getVersion(res);
version = calVersion(version,1);//当前个版本
var t = time();
t.format="%Y-%m-%d";
var log = tostring(t) + "更新日志:"
var updatefile = updateDir + "index.html";
var logtxt = string.load(updatefile):"";
html = string.format(html,version, log)
string.save(updatefile,html + logtxt);

var updateExe = updateDir + exeName + ".exe";
io.remove(updateExe)

var upxExe = projectDir + "Publish\" + exeName + ".upx.exe";
var mainExe = projectDir + "Publish\" + exeName + ".exe";
if(io.exist(upxExe)){
fsys.copy(upxExe,updateExe);
}else {
fsys.copy(mainExe,updateExe);
}
}
}

}


admin

赞同来自:

update = class {
ctor(updateUrl, downUrl, mainExe, winform, cmdmsg ){
this.updateUrl = updateUrl;
this.downUrl = downUrl;
this.winform = winform;
this.cmdmsg = cmdmsg;
this.updateExe = string.replace(mainExe,"\.","_u.");//更新程序名称
this.updateExeOld = string.replace(mainExe,"\.","_update.");//更新程序名称
this.mainExe = mainExe;  //主程序名称
this.updateDir = io._exedir; //更新的程序目录
this.exeDir = this.updateDir; //主程序路径
};

//获取最新版本号
getNewVer = function(){
var http = inet.http()
html = http.get(this.updateUrl):"";
http.close();
var ver,log = string.match(html,"ver=\[(.*?)\].*?log=\[(.*?)\]");
return ver,log;
};

//检查是否要更新
checkUpdate = function(ver,up=false){
var bool = false;
if(this.cmdmsg == "-update"){//开始下载更新
process.kill(this.mainExe)
var downBox = inet.downBox(,"程序升级")
downBox.endProc = function(ret,fileSize,err){
if(ret){
downBox.close()
if(this.winform){this.winform.close();}
io.remove(this.exeDir + this.mainExe + ".dowload")
win.delay(100)
process(this.exeDir + this.mainExe)
if(this.winform){this.winform.close();}
return ;
}
}
downBox.download(this.downUrl,this.exeDir + this.mainExe);
}else {
var newVer,logtxt = this.getNewVer();//最新版本号
if(newVer){
newVernum = string.replace(newVer,"\.","");
ver = string.replace(ver,"\.","");
if(tonumber(newVernum)>tonumber(ver)){ //有新版本
bool = true;
var str = "有新的版本[" + newVer + "]是否现在更新?" + '\n' + logtxt;
if(!up){
ok = win.msgboxTest(str,"更新")
}else {
ok = true;
win.msgbox(str,"更新");
}
if(ok){
fsys.createDir(this.updateDir)
process.kill(this.updateExe)
win.delay(100)
io.remove(this.updateDir + this.updateExe);//删除更新文件
sleep(500);
var updateExePath = fsys.joinpath(this.updateDir,"\" + this.updateExe);
fsys.copy(io._exepath,updateExePath);//复制到临时目录
sleep(500);
if(io.exist(updateExePath)){
process(updateExePath,"-update");//命令参数 cmd
}else {
ok = win.msgboxTest("无法启动更新程序,是否手动下载最新版?","错误");
if(ok){
win.msgbox("下载后请手动覆盖" + this.mainExe + "即可","提示")
process.execute(this.downUrl);
}
}
if(this.winform){this.winform.close();}
return true;
}
}
}
process.kill(this.updateExe)
win.delay(100)
//io.remove(this.updateDir + this.updateExe);//删除更新文件
io.remove(this.updateDir + this.updateExeOld);
io.remove(this.exeDir + this.mainExe + ".dowload")
io.remove(this.exeDir + this.mainExe + ".dow!oad")
return bool,newVer;
}
}
}


admin

赞同来自:

利用webkit的js调用aardio控制函数:

首先新建一个webkit界面

将代码文件main.aardio里面的内容删除,拷贝layui的演示程序代码

地址:https://www.layui.com/demo/

将里面的代码修改为:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <title>layui在线调试</title>
  <link rel="stylesheet" href="layui/css/layui.css" media="all">
  <style>
    body{margin: 10px;}
  </style>
</head>
<body>
 
<blockquote class="layui-elem-quote">
  温馨提示:如果最左侧的导航的高度超出了你的屏幕,你可以将鼠标移入导航区域,然后滑动鼠标滚轮即可
</blockquote>
 
<div class="layui-tab layui-tab-card" lay-filter="demo" style="height: 300px;">
  <ul class="layui-tab-title">
    <li class="layui-this">演示说明</li>
    <li>标题一</li>
    <li>标题二</li>
    <li>标题三</li>
  </ul>
  <div class="layui-tab-content">
    <div class="layui-tab-item layui-show">
       在这里,你将以最直观的形式体验Layui!在编辑器中可以执行layui相关的一切代码。
      <br>你也可以点击左侧导航针对性地试验我们提供的示例。
    </div>
    <div class="layui-tab-item">内容1</div>
    <div class="layui-tab-item">内容2</div>
    <div class="layui-tab-item">内容3</div>
  </div>
</div>
 
<div id="pageDemo"></div>
 
<script src="layui/layui.js"></script>
<script>
layui.use(['layer', 'laypage', 'element'], function(){
  var layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
  
  //向世界问个好
 // layer.msg('Hello World');
 external.aardioCall("你好,我是webkit");
  //监听Tab切换
  element.on('tab(demo)', function(data){
    layer.msg('切换了:'+ this.innerHTML);
    console.log(data);
  });
  
  //分页
  laypage({
    cont: 'pageDemo' //分页容器的id
    ,pages: 100 //总页数
    ,skin: '#5FB878' //自定义选中色值
    //,skip: true //开启跳页
    ,jump: function(obj, first){
      if(!first){
        layer.msg('第'+ obj.curr +'页');
      }
    }
  });
});
</script>
</body>
</html>

这里注意到:

  //向世界问个好
 // layer.msg('Hello World');
 external.aardioCall("你好,我是webkit");

被我改成了这个,意思是打开界面的时候,只要js装载完毕,运行向世界问好,这里利用了

js的external接口,调用外部的名称为aardiocall的函数,而这个函数在我们mainform中定义如下:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="webkit浏览器支持库";right=972;bottom=594;border="none";mode="popup")
mainForm.add()
/*}}*/

//导入webkit支持库
import web.kit.form;
import web.kit.jsFunction;
var wbKitView = web.kit.form(mainForm);//创建webkit浏览器窗口

//使用external接口定义网页脚本可调用的本地函数
wbKitView.external = {

    aardioCall = function(str){ 
        mainForm.msgbox(str);
    };
}

//打开链接时触发
wbKitView.onNavigation = function(url,navigationType){ 
if( navigationType == 0/*_WKE_NAVIGATION_TYPE_LINKCLICK*/ ){

}
return true;
}

import wsock.tcp.simpleHttpServer;
wbKitView.go( wsock.tcp.simpleHttpServer.startUrl("/html/main.aardio") ); 

//可以使用CSS选择器获取HTML节点对象
//wbKitView.querySelector("#header .title-bar .title").innerText = "我 的 软 件";

//添加可拖动边框
import win.ui.resizeBorder;
win.ui.resizeBorder(mainForm);

//添加阴影
import win.ui.shadow;
win.ui.shadow(mainForm);

//限定最大化范围
import win.ui.minmax;
win.ui.minmax(mainForm);

mainForm.show();
win.loopMessage();

运行截图

blob.png

admin

赞同来自: 楚鸟

观察上面的代码发现js的监听示例:

<script src="layui/layui.js"></script>
<script>
layui.use(['layer', 'laypage', 'element'], function(){
  var layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
  
  //向世界问个好
 // layer.msg('Hello World');
 external.aardioCall("你好,我是webkit");
  //监听Tab切换
  element.on('tab(demo)', function(data){
    layer.msg('切换了:'+ this.innerHTML);
    console.log(data);
  });
  
  //分页
  laypage({
    cont: 'pageDemo' //分页容器的id
    ,pages: 100 //总页数
    ,skin: '#5FB878' //自定义选中色值
    //,skip: true //开启跳页
    ,jump: function(obj, first){
      if(!first){
        layer.msg('第'+ obj.curr +'页');
      }
    }
  });
});
</script>

这里我做一个假设,观察到html代码里面:

<div class="layui-tab layui-tab-card" lay-filter="demo" style="height: 300px;">
  <ul class="layui-tab-title">
    <li class="layui-this">演示说明</li>
    <li>标题一</li>
    <li>标题二</li>
    <li>标题三</li>
  </ul>

这里面有个

lay-filter="demo"

猜测,这个就是监听区别于其他的特征码

于是将demo改为demo2,发现,运行时,确实不好再提示切换了xxx

将监听代码里面的demo改为demo2之后,运行,又可以监听动作了

admin

赞同来自:

aardio中点击按钮调用js函数再html中增加tab

mainForm.button.oncommand = function(id,event){
 wbKitView.doScript(" 
 
layui.use(['layer', 'laypage', 'element'], function(){
  var layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
 element.tabAdd('demo', {
  title: '还好几个'
  ,content: '选项卡的内容' //支持传入html
  ,id: '选项卡标题的lay-id属性值'
});    

});

 


");
}

blob.png

admin

赞同来自:

webkit应用:

通过按钮点击事件,修改js中的变量,用于修改显示的tab名.

在界面html的js中添加一个变量,如下面的ggggu = '法国红酒'就是定义的js全局变量

<script>
var ggggu = '法国红酒';
layui.use(['layer', 'laypage', 'element'], function(){
  var layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
   
  //向世界问个好
 // layer.msg('Hello World');
 external.aardioCall("你好,我是webkit");
  //监听Tab切换
  element.on('tab(demo)', function(data){
    layer.msg('切换了:'+ this.innerHTML);
    console.log(data);
  });
   
  //分页
  laypage({
    cont: 'pageDemo' //分页容器的id
    ,pages: 100 //总页数
    ,skin: '#5FB878' //自定义选中色值
    //,skip: true //开启跳页
    ,jump: function(obj, first){
      if(!first){
        layer.msg('第'+ obj.curr +'页');
      }
    }
  });
});
</script>

只有用上面的办法才能再主程序中修改,

var flagu = 0;
mainForm.button.oncommand = function(id,event){
flagu++;
wbKitView.script.ggggu = "哈哈哈"+flagu;
 wbKitView.doScript(" 
 
layui.use(['layer', 'laypage', 'element'], function(){
  var layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
 element.tabAdd('demo', {
  title: ggggu
  ,content: '选项卡的内容' //支持传入html
  ,id: '选项卡标题的lay-id属性值'
});    

});

 


");
}

修改的方法必须是下面的这种调用

wbKitView.script.ggggu = "哈哈哈"+flagu;

blob.png

admin

赞同来自:

思考:为什么要写那么一大串的代码才能实现添加一个tab,

从html中可以看到源码本来已经定义了element,但是再主程序中还要重复var element一次

猜测应该是js中定义的是局部变量

blob.png

判断把这个var给删掉,然后主程序中就不用重复下面的代码了

blob.png

删除掉没用的代码之后,最终得到如下:

var flagu = 0;
mainForm.button.oncommand = function(id,event){
flagu++;
wbKitView.script.ggggu = "哈哈哈"+flagu;
  wbKitView.doScript(" 
 
  element.tabAdd('demo', {
   title: ggggu
   ,content: '选项卡的内容'
   ,id: '选项卡标题的lay-id属性值'
});    

");
}
<script>
var ggggu = '法国红酒';
layui.use(['layer', 'laypage', 'element'], function(){
  layer = layui.layer
  ,laypage = layui.laypage
  ,element = layui.element();
   
  //向世界问个好
 // layer.msg('Hello World');
 external.aardioCall("你好,我是webkit");
  //监听Tab切换
  element.on('tab(demo)', function(data){
    layer.msg('切换了:'+ this.innerHTML);
    console.log(data);
  });
   
  //分页
  laypage({
    cont: 'pageDemo' //分页容器的id
    ,pages: 100 //总页数
    ,skin: '#5FB878' //自定义选中色值
    //,skip: true //开启跳页
    ,jump: function(obj, first){
      if(!first){
        layer.msg('第'+ obj.curr +'页');
      }
    }
  });
});
</script>

实现了上面的效果,增加了tab

admin

赞同来自:

列表框添加数据后滚动条自动到最底部:

窗口代码底部添加:

//listbox的滚动条显示最下方,消息方式
mainForm.listbox.scrollToBottom = function () {

    return ::SendMessageInt(owner.hwnd, 0x115/*_WM_VSCROLL*/, 0x7/*_SB_BOTTOM*/, 0);

}
//设置竖型滚动条事件
::SendMessageInt( mainForm.listbox.hwnd,0x194/*_LB_SETHORIZONTALEXTENT*/,500,0)

使用的时候在需要用的地方写入:

mainForm.listbox.scrollToBottom();

blob.png

blob.png

admin

赞同来自:

import console; 
//var num = console.getNumber( "请输入数值:" )

func = { }
func.ff1 = {
ff2 = {
x = 1;
y = 2;
}
};
func.ffb = {
ffc = {
x = 1;
y = 3;
}
};




console.log(tostring(func.ff1.ff2.x) );
console.log(tostring(func.ffb.ffc.y) );
console.pause(true);

blob.png

admin

赞同来自:

对比上面的,嵌套调用:

import console; 
//var num = console.getNumber( "请输入数值:" )

func = { }
func.ff1 = {
ff2 = {
x = 1;
y = 556;
}
};
func.ffb = {
ffc = {
x = 1;
y = func.ff1;
}
};




console.log(tostring(func.ff1.ff2.x) );
console.log(tostring(func.ffb.ffc.y.ff2.y) );
console.pause(true);

blob.png

admin

赞同来自:

aardio获取QQ消息:


一般来说,我都不推荐大家把现有的C/C++非要翻译为aardio代码,有现成的就不要自己写,能拿别人的就不自己造 - 这是aardio奉行的基本原则之一。

这可不是说C/C++能做的事用aardio就一定做不到,例如这个取QQ消息,虽然都是对指针数组的操作,真要用aardio写一遍可并不是难事,这么说吧,比起C++代码来说,我们用aardio,只要用一半的代码就可以了, 废话不多说,上代码(注意在电脑上打开看): 

import com;
var oleacc = ..raw.loadDll("OLEACC.DLL"); 
IID_IAccessible = '\xE0\x36\x87\x61\x3D\x3C\xCF\x11\x81\x0C\x00\xAA\x00\x38\x9B\x71';

var findAccessibleChildren;
findAccessibleChildren = function(accParent,name){

    //这里用结构体数组也可以,直接分配内存代码更简单,因为aardio分配内存时已经初始化为VT_EMPTY,所以不需要 VariantInit
    var output = raw.malloc( 16/*sizeof(Variant)*/ * accParent.accChildCount );
 
    obtained = {int size};//用结构体给API提供int指针
    var pAccParent = com.GetPointer(accParent); //aardio为了避免指针操作失误,不允许COM对象自动转换为指针,所以自己取一下
    var hr,obtained = oleacc.AccessibleChildren(pAccParent, 0,accParent.accChildCount, output,obtained);
    com.Release(pAccParent); 
    if( hr < 0 ) return;//COM中小于0的都是错误码

    for(i=0;obtained.size-1;1){
        var p = raw.toPointer(output,16*i);
        var t = raw.convert(p,{word value}).value;
        if( t != 9/*_VT_DISPATCH*/ ) continue;
        
        //将数组中Variant结构体的指针转换为Variant对象,方便操作
        var variant = com.Variant( p,true);
        var accChild = com.QueryObject( variant.pdispVal ); //转换为COM对象(COM.IDispatch)
        variant.clear();//释放Variant对象
        
        if( accChild.accName(0/*CHILDID_SELF*/) == name ){  
            var v = accChild.accValue(0/*CHILDID_SELF*/);
            if(#v) return v;
        }
        
        var v = findAccessibleChildren(accChild,name);
        if(#v) return v;
    }
}

findAccessibleString = function(hwnd,name){
    var pvObject = {ptr p}
    if( 0 == oleacc.AccessibleObjectFromWindow(hwnd,0,IID_IAccessible,pvObject) ){ 
        var accParent = com.QueryObject( pvObject.p ); //转换为COM对象(COM.IDispatch)
        com.Release(pvObject.p);
        
        return findAccessibleChildren( com.QueryObject( pvObject.p ),name );
    }   
}

import winex;
import console;

for hwnd in winex.each( "TXGuiFoundation") { 
    var qqMessage = findAccessibleString(hwnd,"消息");
    if( #qqMessage ) console.log( qqMessage )
}

console.pause();


admin

赞同来自:

调用绘图版API

在carl论坛里有这么一个帖子《50行代码搞定数位板 + 画图》,原帖地址:http://bbs.aardio.org/forum.ph ... e%3D1 实际上这个帖子里包含库写了1000余行代码,分享精神难得,但是代码还是有一些问题运行也会报错,尝试修正库路径这些错误以后,绘图板还是画不出东西。

wintab是绘图板都支持的通用接口标准,Wacom文档以及示例参考这里: http://www.wacomeng.com/windows/ 其实这个接口还是比较简单的,即使在aardio老的ansi版本中调用unicode api也用不到上千行代码,下面我把代码精简了一下大概一百行代码(
支持aardio 老的ansi 版本,以及新的unicode版本)

当然运行下面的代码先得有个绘图板,先上个图看看效果(小孩在涂鸦):

import win.ui;
/*DSG{{*/
var winform = win.form(text="请使用压感笔在绘图板上画图";right=759;bottom=469)
winform.add()
/*}}*/

//http://www.wacomeng.com/windows/
::Wintab32 := ..raw.loadDll("Wintab32.dll");

var lContext = {
    WORD lcName[40/*_LCNAMELEN*/];
    INT  lcOptions;
    INT  lcStatus;
    INT  lcLocks;
    INT  lcMsgBase;
    INT  lcDevice;
    INT  lcPktRate;
    INT  lcPktData;
    INT  lcPktMode;
    INT  lcMoveMask;
    INT  lcBtnDnMask;
    INT  lcBtnUpMask;
    int  lcInOrgX;
    int  lcInOrgY;
    int  lcInOrgZ;
    int  lcInExtX;
    int  lcInExtY;
    int  lcInExtZ;
    int  lcOutOrgX;
    int  lcOutOrgY;
    int  lcOutOrgZ;
    int  lcOutExtX;
    int  lcOutExtY;
    int  lcOutExtZ;
    INT  lcSensX;
    INT  lcSensY;
    INT  lcSensZ;
    int  lcSysMode;
    int  lcSysOrgX;
    int  lcSysOrgY;
    int  lcSysExtX;
    int  lcSysExtY;
    INT  lcSysSensX;
    INT  lcSysSensY;
}

::Wintab32.WTInfoW( 3/*WTI_DEFCONTEXT*/, 0, lContext);
lContext.lcOptions = 4/*_CXO_MESSAGES*/;
lContext.lcPktData =  0x40/*_PK_BUTTONS*/ 
    | 0x400/*_PK_NORMAL_PRESSURE*/ 
    | 0x80/*_PK_X*/
    | 0x100/*_PK_Y*/
    | 0x200/*_PK_Z*/;

//准备GDI+绘图对象
import gdip.pen;
import gdip.graphics;
var graphics = gdip.graphics(winform);
var pen = gdip.pen(0xFF000000, 1, 2);
var brush = gdip.solidBrush(0xFF000000);
winform.prevX, winform.prevY = 0, 0;
winform.prevNormalPressure = 0;

//响应绘图板消息
winform.wndproc = { 
    [0x7FF0/*_WT_PACKET*/] = function(hwnd, message, wParam, lParam){
        var packet = {
            INT pkButtons;
            int pkX;
            int pkY;
            int pkZ;
            INT pkNormalPressure;
        };
        
        //获取绘图板数据
        ::Wintab32.WTPacket(winform.hTablet, wParam, packet);
        var x,y,cx,cy = winform.getPos();
        
        if packet.pkNormalPressure{
            ::User32.SetCursor(null);//隐藏光标
            x = (cx * packet.pkX) / lContext.lcInExtX; //获取压感笔x坐标
            y = cy - (cy * packet.pkY) / lContext.lcInExtY; //获取压感笔y坐标
            if winform.prevNormalPressure == 0{
                winform.prevX, winform.prevY = x, y
            }
            select packet.pkButtons{
                case 1{
                    var size = packet.pkNormalPressure * 20 / 1024; //压力转换为笔尖大小
                    pen.width = size
                    brush.color = 0xFF000000
                    pen.color = brush.color
                    graphics.fillEllipse(brush, winform.prevX - size / 2, winform.prevY - size / 2, size, size)
                    graphics.drawLine(pen, x, y, winform.prevX, winform.prevY)
                }
                case 3{
                    var size = packet.pkNormalPressure * 50 / 1024 //压力转换为笔尖大小
                    pen.width = size
                    brush.color = 0xFFEEEEEE;
                    pen.color = brush.color
                    graphics.fillEllipse(brush, winform.prevX - size / 2, winform.prevY - size / 2, size, size)
                    graphics.drawLine(pen, x, y, winform.prevX, winform.prevY)
                }
            }
            winform.prevX, winform.prevY = x, y
        }
        
        winform.prevNormalPressure = packet.pkNormalPressure
        return 0;
    }
}

winform.show() 

//打开绘图板
winform.hTablet = ::Wintab32.WTOpenW(winform.hwnd, lContext, true);
win.setActive(winform.hwnd); //不然要鼠标点一下才能画

win.loopMessage();


楚鸟

赞同来自:

哈哈,不错,有些我转走了,继续努力

admin

赞同来自:

getUser = function(){
if(!abc){
abc = loadcodex("\GetUser.aardio")
}else{
win.close(abc.hwnd)
abc = null
}
}

blob.png

admin

赞同来自:

枚举文件的两种办法:

import console;
import fsys
console.open();
var sss = "sleep";
var 结果={}
var t = time.tick()
fsys.enum( "~/lib/", "*.aardio",
function(dir,filename,fullpath,findData){ 
if(filename){
            var str = string.load(fullpath)
            if(string.indexOf(str,sss)){
            table.push(结果,fullpath)
            }
}

,/*如果此参数为false则忽略子目录*/
);
console.print(time.tick()-t)
console.varDump(结果)
execute("pause")

blob.png

多线程方式:

 import console; 
import fsys

var fileTab = {}
fsys.enum( "~/lib", "*.aardio",
function(dir,filename,fullpath,findData){ 
if(filename){ 
           // io.print("发现文件:"+filename,"完整路径:"+fullpath)
            table.push(fileTab,fullpath)
}


,/*如果此参数为false则忽略子目录*/
);
thread.set("标志键", "fsys")
import thread.works
var works = thread.works( 20,
function( args ) {
import console
if(string.indexOf(string.load(args),thread.get("标志键")))
console.log(args)

);

for(i=1;#fileTab;1){
works.push(fileTab[i])
}
works.wait()
console.log("ok")
console.pause(true);

blob.png

admin

赞同来自:

mainForm.listbox.wndproc = function(hwnd,message,wParam,lParam){
select(message) {
case 0x233/*_WM_DROPFILES*/ {
mainForm.listbox.clear();
var path = win.getDropFile(wParam)[1];
var filecontent = string.load(path);
var linestr = string.split(filecontent,'<\r\n>')
for(i=1;#linestr;1){
mainForm.listbox.add(linestr[i]);
}

}
else {
}
}

}

消息回调,拖放文件处理,字符串处理后根据回车和换行符将每列数据写入items

注意:

string.split(filecontent,'<\r\n>')

中的<>意思是得出的字符中不在包含改字符.

blob.png

admin

赞同来自:

解决乱码问题,utf8,拖放asni编码的文件,显示乱码处理

mainForm.listbox.wndproc = function(hwnd,message,wParam,lParam){
select(message) {
case 0x233/*_WM_DROPFILES*/ {
mainForm.listbox.clear();
var path = win.getDropFile(wParam)[1];
var filecontent = string.load(path);
var linestr = string.split(filecontent,'<\r\n>')
for(i=1;#linestr;1){
//增加编码转换,这样就不会显示乱码了
mainForm.listbox.add(string.fromto(linestr[i],0,65001));
}

}
else {
}
}

}

这里用到了 编码转换函数

string.fromto("UTF8编码的字符串",0,65001);

blob.png

admin

赞同来自:

分解字符串中的字符和数字,以便后续处理数据

import console; 
console.open()

//随便定义一个包含数字,负号,小数点的字符串,进行单字符分割
var strrr =  string.split("58 N5 G01 Z-1.647 F-100") 
var num = "";
for(i=1;#strrr;1){
//如果字符为空字符则不作处理继续循环
if(strrr == " "){
continue ;
}
//强制转换为数字格式,不是数字则返回null,是则返回数字
var k,v = tonumber(strrr[i]);
//判断是数字,或者是负号,或者是小数点?
if( (k != null) || (strrr[i] == "-")|| (strrr[i] == ".")){
//连接这些数字
num = num ++ strrr[i];
//如果字符串末尾是数字,则直接输出数字
if(i == #strrr){
console.log(num)
num ="";
}
}else { //不是数字,直接输出
[/i][/i][/i][/i]
[i][i][i][i]if(num != ""){
console.log(num)
num = "";
[/i][/i][/i][/i]
[i][i][i][i]}
console.log(strrr[i])
}

}

console.pause(true);

blob.png

[/i][/i][/i][/i][/i]

admin

赞同来自:

分解字符串中的数字和字符代码:

上述图片中代码有点小问题,就是输出的时候会有空格的可能,所以重新进行修改

G_conv = function(str){
var delspace = string.replace(str," ","");
var letter = string.split(delspace);
var num = "";
for(i=1;#letter;1){
     //如果字符为空字符则不作处理继续循环
     if(letter[i] == " "){
         continue ;
     }
     //强制转换为数字格式,不是数字则返回null,是则返回数字
     var k,v = tonumber(letter[i]);
     //判断是数字,或者是负号,或者是小数点?
     if( (k != null) || (letter[i] == "-")|| (letter[i] == ".")){
         //连接这些数字
         num = num ++ letter[i];
         //如果字符串末尾是数字,则直接输出数字
         if(i == #letter){
             //console.log(num)
             mainForm.Motion_file.add(num);
             num ="";
         }
     }else {    //不是数字,直接输出
     if(num != ""){
     mainForm.Motion_file.add(num);
     num = "";
     }
         //console.log(num)
         mainForm.Motion_file.add(letter[i]);
         //console.log(letter[i])
     }
 
}
 


}

blob.png

admin

赞同来自:

转载,

取QQ消息改进版

blob.png

这次换个写法,不使用 com.Variant而是直接使用结构体。

并且改用对话框显示QQ消息,因为QQ消息包含Unicode字符,上次范例中的控制台显示的是不完整的消息,代码如下:

import com;

var oleaut = raw.loadDll("OleAut32.DLL"); 
var oleacc = raw.loadDll("OLEACC.DLL"); 
IID_IAccessible = '\xE0\x36\x87\x61\x3D\x3C\xCF\x11\x81\x0C\x00\xAA\x00\x38\x9B\x71';

var findAccessibleChildren;
findAccessibleChildren = function(accParent,name){ 

    //结构体数组
    var variants = { 
        struct item[] ={ 
            //动态数组,使用length指定数组长度
            length = accParent.accChildCount;
            {
                WORD vt; 
                WORD r1;
                WORD r2;
                WORD r3;
                ptr pdispVal;
                ptr r4;
            };
        }
    }
    
    var obtained = {int size};//用结构体给API提供int指针
    var hr = oleacc.AccessibleChildren(accParent, 0,accParent.accChildCount, variants,obtained);
    if( hr < 0 ) return;//COM中小于0的都是错误码

    for(i=1;obtained.size;1){
        var variant = variants.item[ i ] 
        if( variant.vt != 9/*_VT_DISPATCH*/ ) {
            oleaut.VariantClear(variant);
            continue;
        }
        
        var accChild = com.QueryObject( variant.pdispVal ); //转换为COM对象(COM.IDispatch)
        oleaut.VariantClear(variant);;//释放Variant对象
        
        if( accChild.accName(0/*CHILDID_SELF*/) == name ){  
            var v = accChild.accValue(0/*CHILDID_SELF*/);
            if(#v) return v;
        }
        
        var v = findAccessibleChildren(accChild,name);
        if(#v) return v;
    }
}

findAccessibleString = function(hwnd,name){
    var pvObject = {ptr p}
    if( 0 == oleacc.AccessibleObjectFromWindow(hwnd,0,IID_IAccessible,pvObject) ){ 
        var accParent = com.QueryObject( pvObject.p ); //转换为COM对象(COM.IDispatch)
        com.Release(pvObject.p);
        
        return findAccessibleChildren( com.QueryObject( pvObject.p ),name );
    }   
}

import winex;
import console;

for hwnd in winex.each( "TXGuiFoundation") { 
    var qqMessage = findAccessibleString(hwnd,"消息");
    if( #qqMessage ) win.msgbox( qqMessage )
}


admin

赞同来自:

class类的使用:

class ablow{
int xx = 123;
int yy = 456;
int zz = 789;
}
//实例化
var cclow = ablow();

console.log(cclow.zz)
console.dump(cclow)
//不实例化的话,是不能输出值的
console.log(ablow.zz)
console.dump(ablow

blob.png

admin

赞同来自:

找到控制外部ListView视图控件中专攻SysListView32这类名的ListView视图控件获得每格数据方法,但只限于SysListView32类名的。VB6、NET系列制作的ListView内容暂时不能获取


//循环抓外部LISTVIEW数据
import console; 
import winex;
import winex.ctrl.listview;
var hwnd1,线程ID,进程ID = winex.find( ,"Form1",,) //Form1 换为被抓数据的软件的父窗口标题。
for hwnd,title,theadId,processId in winex.each( ,,hwnd1) { 
        var classname1 = win.getClass(hwnd);
        console.log(hwnd,title,theadId,processId ,classname1);
        if(classname1 == "SysListView32") {  //SysListView32 而VB6编译出的ListView20WndClass及NET系列的部分不能。
                var listview = winex.ctrl.listview( hwnd ); 
                var y = listview.count;
                var x =listview.columnCount;
                var rcItem = ::RECT(); 
                for(i=1;y;1 ) {  
                            for(j=1;x;1 ) {  
                                    var itemText = listview.getItemText(i,j,100);
                                     console.log(i,j, itemText );
                             }
                }  
        }        
}
console.pause();

验证抓取bushound里面的数据:


//循环抓外部LISTVIEW数据
import console; 
import winex;
import winex.ctrl.listview;
var hwnd1,线程ID,进程ID = winex.find( ,"Bus Hound",,) //Form1 换为被抓数据的软件的父窗口标题。
console.log(hwnd1,线程ID,进程ID)
for hwnd,title,theadId,processId in winex.each( ,,hwnd1) { 
        var classname1 = win.getClass(hwnd);
        console.log(hwnd,title,theadId,processId ,classname1);
        if(classname1 == "SysListView32") {  //SysListView32 而VB6编译出的ListView20WndClass及NET系列的部分不能。
                var listview = winex.ctrl.listview( hwnd ); 
                var y = listview.count;
                var x =listview.columnCount;
                var rcItem = ::RECT(); 
                for(i=1;y;1 ) {  
                            for(j=1;x;1 ) {  
                                    var itemText = listview.getItemText(i,j,100);
                                     console.log(i,j, itemText );
                             }
                }  
        }        
}
hwnd = 66120;//此数据是编程助手抓到的list控件的句柄
var listview = winex.ctrl.listview( hwnd ); 

                var y = listview.count;
                var x =listview.columnCount;
console.log(y ,x)
for(i=1;y;1 ) {  var str = "";
                            for(j=1;x;1 ) {  
                                    var itemText = listview.getItemText(i,j,1000);
                                     str = str ++ "||"++ itemText;
                                     
                             }
                             console.log(str );
                             console.more()
                }  

console.pause();


admin

赞同来自:

blob.png

admin

赞同来自:

技巧: listview中怎么才能把默认的高度调大?

listview默认是没有调节高度的功能的,只能通过其他的办法.

这里利用image来设置它的高度,将其撑大.

生成的代码里添加:

import win.imageList;
var imagelist = win.imageList(1,30);//行(宽,高)
mainForm.listview.setImageList(imagelist, 1/*_LVSIL_NORMAL*/);

即可,这里我们设置了宽度为1像素,高度为30,效果如图:

blob.png

要回复问题请先登录注册