V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  g00001  ›  全部回复第 1 页 / 共 19 页
回复总数  370
1  2  3  4  5  6  7  8  9  10 ... 19  
19 天前
回复了 liuser666 创建的主题 C# 开发到一半忍不住吐槽一下 Windows 桌面开发
再强大再万能的东西都有他的局限。
例如万能的 Python 网上搜一下也有很多跑去用 Python + aardio 做桌面开发。

.Net 就是房车,复杂就是他的使命。
要简单和接口自由可以开 aardio 这种小自行车。

官网上有篇文章《看看短短几句 aardio 代码能做什么》,抠了几段过来:

aardio 调用原生 API
-----------------------------------
::User32.GetCursorPos({ INT x; INT y; });


aardio 调用 .Net
-----------------------------------

import console;
import dotNet;
var System = dotNet.load("System").import("System");
var uri = System.Uri("https://www.aardio.com")

console.log( uri.Host );
console.log( uri.GetHashCode() );


aardio 调用 Python
-----------------------------------
import console;
import py3;

var itertools = py3.import("itertools")
var permutations = itertools.permutations({"a","b","c"});
var pyList = py3.list(permutations);

for( item in pyList.each() ){
console.log(item);
}


将任何网络 API 自动导入 aardio
-----------------------------------
import web.rest.jsonLiteClient;
var http = web.rest.jsonLiteClient();

var countApi = http.api("https://api.countapi.xyz/hit{/domain}{/key}")
var data = countApi["key"].get();
Node.js 虽然强大,毕竟不是专为 Windows 设计,有时候这种坑是真不少,
用一段 aardio 代码解释一下 Node.js 为什么会有乱码:

import win.ui;
/*DSG{{*/
var winform = win.form(text="Node.js";right=754;bottom=457)
winform.add(
edit={cls="edit";left=21;top=19;right=727;bottom=426;edge=1;multiline=1;z=1}
)
/*}}*/

import nodeJs;
nodeJs.require("iconv-lite");

var testjs = /***
console.log("双方编码一致没乱码:")
console.log(process.argv);

const iconv = require('iconv-lite');
const { exec } = require('child_process');
exec('echo 中文', { encoding: 'binary' }, (err, stdout, stderr) => {
console.log("乱码了:",stdout);
stdout = iconv.decode(Buffer.from(stdout, 'binary'), 'cp936');
console.log("不乱码了:",stdout);
});
***/

var node = nodeJs.exec(testjs,"--log","测试 UTF-8 不会乱码 😀");
for( all,out,err in node.each() ){
winform.edit.print(all);
}

winform.show();
win.loopMessage();
没有东西是万能没有缺点的,
Python 虽强,但不是专为 Windows 设计,
Google 一下 “aardio python” 很多人还是会用 aardio + Python 混编。

aardio 里可以嵌入 Python,可以嵌入批处理,还可以嵌入 C 语言。
批处理做很多事还是很强的,每个语言都有他的长处。
39 天前
回复了 ling516 创建的主题 Windows bat 脚本怎么加密,不想让人看到
可以在 aardio 里嵌入 BAT 生成 EXE 文件,
方法很简单, 例如下面几句代码按 F7 就可以生成 EXE 了:

import console
import process.batch;

//批处理 for 遍历并拆分字符串
var bat = process.batch(`
@echo off
for %%i in (abc,def,xyz) do echo %%i
`)
console.log(bat.read(-1))

console.pause()

这样对付一般的小白用户没问题了,
如果还想增加难度,可以把关键信息用 C 语言实现,批处理可以与 aardio 混编,aardio 又可以方便地调用 C 写的 DLL,例如:

import tcc;
//编译 DLL
tcc.build( "/start.dll" ).code = /***
#include <windows.h>
__declspec(dllexport) int Add( int a,int b )
{
return a + b;
}
***/

//加载 DLL
var dll = raw.loadDll( "/start.dll",,"cdecl" );
//调用 C 函数
var result = dll.Add(12,3);
aardio 里网页调用原生 DLL 相对简单一些。

嵌入 Electron 组件调用 DLL :
---------------------------

import electron.app;
var theApp = electron.app();

theApp.html = /**
<script>
aardio = require("aardio");
aardio.msgBox("内容","标题");
</script>
**/

theApp.external = {
msgBox = function(text,caption){
::User32.MessageBox(theApp.hwndChrome,text,caption,0)
}
}

theApp.start("/res/index.html");
win.loopMessage();


WebView2 调用 DLL :
---------------------------

import win.ui;
var winform = win.form(text="WebView2")

import web.view;
var wb = web.view(winform);
wb.external = {
msgBox = function(text,caption){
::User32.MessageBox(winform.hwnd,text,caption,0)
}
}

wb.html = /**
<script> aardio.msgBox("内容","标题");</script>
**/

winform.show();
win.loopMessage();


JavaScript 直接调用 DLL :
---------------------------

import win.ui;
var winform = win.form(text="JS 直接调用 WinAPI")

import web.blink.form;
var mb = web.blink.form(winform);
web.blink.export(
user32 = ::User32;//导出 DLL 对象为 JS 全局变量
form = winform; //窗口对象也可以导出为 JS 变量
blink = mb; //mb 自己也可以导出为 JS 变量
);

mb.html = /**
<a href='javascript:
user32.MessageBox(0,"JS 直接调用 WinAPI","user32.MessageBox",0)
'>JS 直接调用 WinAPI 函数试一下</a>
**/

winform.show()
win.loopMessage();
部署非官方的文档网站对于一个需要频繁更新的产品确实会带来不必要的混乱和维护上的困难。

即使有开放的开源协议也不等于可以为所欲为,WinXray 是公共域开源,但是就有人抢注域名并在 GitHub 伪造大量虚假代码提交冒充官方,一个钓鱼项目欺骗了上千 star,你跟这些人讲道德规范?!抱歉他字典里没这东西。

问题不在于什么开源协议,即使你拿掉这个开源协议,明令禁止这样做,结果还是一样会有人这样干。写不出优秀的作品,能被一个优秀作品的作者怒喷 —— 毕竟也能让很多人找到在这个网络的存在感。
73 天前
回复了 Apple2023 创建的主题 iPhone 百度输入法 VS 搜狗输入法
Windows 10 上只需要一个小小的开源软件 wubiLex ( 900 KB ), 就可以使系统输入法摇身一变为各种输入法,这个软件自带一堆五笔 86 、98 、091 、新世纪方案的各种词库,还可以将微软五笔一键变为小鹤音形、郑码输入法。快捷打开、关闭、切换微软五笔、微软拼音、各种双拼方案、自动安装小鹤双拼方案。提供强悍的用户短语管理、可编程的超级热键功能,各种输入方案的图形反查拆解笔顺动画。

不用再倒腾第三方输入法了。
74 天前
回复了 ling516 创建的主题 Windows 图片识别软件 OCR,哪个最好 免费开源的
如果是要工具,找个现成的就可以了。
自己写代码生成 EXE 也很简单,其实 Windows 系统自带一个很不错的 OCR 组件,可以免费用, 下面写个例子:例如在屏幕上找到这个帖子的标题,然后把鼠标移动过去,aardio 代码:

import mouse;
import dotNet.ocr;
var ocr = dotNet.ocr();

var ocrResult = ocr.detectScreen()
var x,y = ocrResult.findPoint("图片识别软件 OCR,哪个最好 免费开源的",0.1);
mouse.moveTo(x,y,true)


或者免费开源的 chineseocr_lite 也不错,用 aardio 调用 chineseocr_lite 的例子:

import mouse;
import string.ocrLite;
import string.ocrLite.defaultModels;

var ocr = string.ocrLite();
var ocrResult = ocr.detectScreen()
var x,y = ocrResult.findPoint("图片识别软件 OCR,哪个最好 免费开源的",0.1);
mouse.moveTo(x,y,true)
74 天前
回复了 ling516 创建的主题 Windows win10 文件夹文件名批量修改工具哪个最好
还是自己写代码好啊,想怎么改就怎么改,
用 aardio 写这种工具非常简单,aardio 自带的范例 “文件操作 / 批量处理” 就有批量重命名工具的源码,可以设定后缀名,文件名匹配规则、甚至是自己指定替换函数。

关键代码其实就是调用 fsys.enum() 函数遍历文件:

import fsys;
fsys.enum( "/指定要遍历的目录路径", "*.*",
function(dir,filename,fullpath,findData){

});

上面的 "*.*" 指定后缀名,支持通配符,可用数组指定多个后缀名,例如 {"*.jpg","*.png"}
在回调函数里存在 filename 变量就是遇到一个文件( 否则就是遇到一个目录 )。

注意:遍历完了以后再实际修改文件名。

如果是中间需要调用 excel 那也很简单,
aardio 读取 Excel 只要加几句代码就搞定了:

import com.excel;
var excel = com.excel();
var sheet = excel.ActiveWorkbook.Sheets(1);

//遍列所有单元格
for(i,values in excel.eachValue(1) ){
//这里 i 是行号,values 是一个数组包含所有列的值
}
74 天前
回复了 sepwolves 创建的主题 Windows 哪里有 AHK 的中文讨论区?
作为 Windows 开发工具,就说说调用 API 这种简单的事,aardio 代码这样:

var fileTime = {
int lowDateTime;
int highDateTime;
}
::Kernel32.SystemTimeToFileTime( time(),fileTime )



AutoIt 代码这样:

$SYSTEMTIME = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
$lpSYSTEMTIME = DllStructGetPtr($SYSTEMTIME)
$LOCALFILETIME=DllStructCreate("dword;dword")
$lpLOCALFILETIME = DllStructGetPtr($LOCALFILETIME)
DllStructSetData($SYSTEMTIME, 1, $Year)
DllStructSetData($SYSTEMTIME, 2, $Month)
DllStructSetData($SYSTEMTIME, 3, _DateToDayOfWeek($Year,$Month,$Day)-1)
DllStructSetData($SYSTEMTIME, 4, $Day)
DllStructSetData($SYSTEMTIME, 5, $Hour)
DllStructSetData($SYSTEMTIME, 6, $Minute)
DllStructSetData($SYSTEMTIME, 7, 0)
DllStructSetData($SYSTEMTIME, 8, 0)
$result = DllCall("kernel32.dll", "long", "SystemTimeToFileTime", "ptr", $lpSystemTime, "ptr", $lpLocalFileTime)
If $result[0] = 0 Then
Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
SetExtended($lastError[0])
SetError(1)
Return 0
EndIf



AutoHotkey 代码这样:

VarSetCapacity(MyFiletime , 64, 0)
VarSetCapacity(MySystemtime, 32, 0)
DayOfWeek=00
Second=00
Millisecond=00
InsertInteger(Year, MySystemtime, 0)
InsertInteger(Month, MySystemtime, 2)
InsertInteger(DayOfWeek, MySystemtime, 4)
InsertInteger(Day, MySystemtime, 6)
InsertInteger(Hour, MySystemtime,8)
InsertInteger(Min, MySystemtime,10)
InsertInteger(Second, MySystemtime,12)
InsertInteger(Millisecond, MySystemtime,14)
DllCall("SystemTimeToFileTime", Str, MySystemtime, UInt, &MyFiletime)
LocalFiletime := ExtractInteger(MyFiletime, 0, false, 64)
VarSetCapacity(MyUTCFiletime , 64, 0)
DllCall("LocalFileTimeToFileTime", Str, MyFiletime, UInt, &MyUTCFiletime)
UTCFiletime := ExtractInteger(MyUTCFiletime, 0, false, 64)


AutoHotkey,AutoIt 写代码其实啰嗦又费事 ,
当然 AutoHotkey 实现简单的热键功能是不错。


aardio 还提供了一个 ahk 扩展库,可以嵌入 AutoHotkey 代码,aardio 与 AutoHotkey 可以相互调用对方的函数。另外 aardio 还可以嵌入十几种其他的第三方编程语言。
按 // 再切换中文打注释嘛,
倒是有种情况确实需要混用中英文标点,例如中文里输入数值后面打小数点、千位分隔符等等。
有些输入法在数值后面可以自动切换英文标点,但微软五笔就没这功能( 下载一个开源软件 wubiLex 可以解决 )。
WebView2 基于 Edge 但与 Edge 完全分离,支持 WIN7,WIN10,WIN11,WIN11 已经自带 WebView2,Office 也会自动安装 WebView2,目前已经有 2 亿台电脑安装了 WebView2,并且未来大概率会完全普及。

使用 WebView2 的软件会公用一个运行时,由系统维护并且会自动更新内核。且 WebView2 的下载安装速度很快,在国内仍然瞬间就能下载安装好。aardio 里的 WebView2 在调用时就会自动检测,如果没有安装会自动安装 —— 瞬间完成用户体验很好。

WebView2 用来开发桌面软件的优势是与本地语言交互的接口很简洁,比 Electron 笨拙的多进程交互方便太多。用 aardio 实现的一个例子:
https://i.v2ex.co/TOPLK3hp.png

如果只是为了做登录窗口,也可以考虑 Sciter JS (支持跨平台) , 可以理解为一个迷你版的 WebView2,而且对桌面开发友好,提供了很多传统网页没有的接口和功能,体积和占用的内存都非常小。Sciter 的前身 HTMLayout,体积更小(只有 2MB ),做出来的界面也非常炫。其实可以用 HTML 写界面的方案很多,aardio 范例里就提供了很多这样的例子:
https://i.v2ex.co/6P6ku110.jpeg

aardio 还可以在任意能执行 JavaScript 的浏览器里通过 aardio.js 调用 aardio 程序导出的函数(调用标准库 web.rpc.externalServer )。
98 天前
回复了 ghmum 创建的主题 Windows windows10 上有没有快速调节系统缩放的工具
aardio 代码:

// 修改系统 DPI ( 175 / 默认缩放 自动切换 )
import gdi;
import sys.dpi;
sys.dpi.scaling(gdi.getDpiScale()!=1.75 && 175)

// 修改显示器分辨率
import sys.monitor;
sys.monitor.changeMode(pelsWidth=1920,pelsHeight=1080)
100 天前
回复了 Suigintou 创建的主题 问与答 遇到一个奇怪要求
@JinTianYi456

非常支持和赞赏你的严谨态度,
对待国产语言我们就是要发扬严于律己、宽以待人的精神认真地扒黑历史。

aardio 十几年一直是免费,十几年没有看到过一个字的商业广告,是一个纯公益性的「个人项目」。对于 aardio 这样拥有十几年的历史的一个国产编程语言,以国人的尿性,有黑历史应该早就被扒一万遍死无全尸了吧?

aardio 的核心代码实际也是开源的,使用了哪些开源的模块在文档里都有清楚的说明,这算黑历史不?!
aardio 提供的所有标准库、扩展库全是开源的,还有很多公共域许可证的开源项目,大量的开源代码估计不太适合隐藏黑历史?!

例如 aardio 宣传的可以嵌入或混合 C 语言、C++、VB 、C#、Java 、Python 、Javascript 、Node.Js 、Flash ActionScript 、PHP 、VBScript 、NewLISP 、AutoLISP 、Delphi 、FreeBASIC 、Ruby 、Rust 、Julia 、Nim 、Go 语言、批处理 ......这一堆第三方语言,实现这些功能的扩展库全是开源的,要不你去看看都都借鉴了谁?!

或者 aardio 宣传的 可以嵌入非常多的浏览器控件,例如系统自带的 WebBrowser 、WebView 控件、 以及 WebView2 、WebKit 、Electron 、CEF3 、HTMLayout 、Sciter...... 甚至可以直接调用系统安装的 Chrome 、Chromium Edge 等浏览器写软件界面。而且在网页中调用本地接口、以及 aardio 与浏览器的交互极其方便,例如直接调用 Javascript 函数,并且在 Javascript 中直接回调 aardio 函数,不需要任何复杂的封装和中间件,你甚至可以在 Javascript 中直接调用 WINAPI 函数,实现这些功能的扩展库也全是开源的,要不你也去看看都借鉴了谁?!

回到楼主的技术问题,
至少用 aardio 实现一个简单的资源管理器要不了几句代码:
https://i.v2ex.co/QgG7AXD8.jpeg

这是 aardio 自带范例里的代码,
关键代码是 win.ui.explorer 这个库 —— 也是开源的( 有没有借鉴别人的黑历史就不清楚了,写代码要做到完全不借鉴别人?吓得我都不敢写代码了)。至于要实现自定义的排序,加几句排序代码就可以,上面 imicksoft 已经写了。

单纯说实现这个功能,并没有什么成本。
至于领导的要求合不合理,就不掺和了。
一般形码输入法切换词库较方便,WIN10 可以下一个开源软件 wubiLex —— 可以将系统输入法一键切换为各种五笔、郑码、小鹤音形 …… 自带数十种词库,而且可以自由编辑词库、自定义短语。
无句柄窗口也不是完全不能控制,
一种方法是使用 UI Automation 或 MSAA ,
举个例子读取 QQ 聊天消息( aardio 代码 )

import winex;
import winex.accObject;
import console;

for hwnd in winex.each( "TXGuiFoundation" ) {

var accObject = winex.accObject.fromWindow(hwnd)
if(accObject){
var accMessage = accObject.find(role="list")
if(accMessage){
for accChild in accMessage.each(){
console.log(accChild.roleText(),accChild.name(),accChild.value())
}
}
}

}

console.pause(true);

还有一种方法是直接窗口截图文字识别, 用 aardio 写个例子:

import winex;
import string.ocrLite;
import string.ocrLite.defaultModels;

var ocr = string.ocrLite(,true);
var hwnd = winex.findExists("窗口标题");
if(!hwnd) return;

var ocrResult = ocr.detectClient(winform.hwnd);
if(ocrResult){

var x,y = ocrResult.findPoint("按钮文本",0.1);
if(x && y){
import mouse;
//无句柄窗口可以直接用 winex.mouse.click() 点击
mouse.moveToWindow(x,y,winform.hwnd);
mouse.click();
}
}
至于你说的 08 年就接触了 aauto —— 并且你当时还觉得很难。
与事实真相冲突:aauto 第一个版本发布于 2011 年。

所以你说后面十多年,把常见的语言都学了一遍,然后打通了任督二脉。
时间线也出现了冲突 —— 怎么凑也凑不足十多年。

任督二脉的事作为故事听着很美,但可惜不是真的。
学 au3 叫苦连天的多了去了,没有一个编程语言「初学者」会觉得容易。
还有很多人觉得 au3 很难,aardio 一看就会了呢。



各种语言用 = 号赋值,分号分隔是很常见的用法,这让你觉得怪和难是吗?!
如你所述的 aardio 代码:

var obj = { name = "value1"; name = "value1" }
---aardio--------------------------------------------------------------------------------------------------

翻译成 au3 要怎么写呢?!倒是在 au3 找到了一个帖子,有人问 au3 怎么实现自定义数据类型、对象、哈希表 …… 该问题经历了 12 年没有得到答案。



作为一个 Windows 开发工具,调用 WINAPI 应当是入门基本功能,
搜了半天找到一段 au3 调用 GetCursorPos 函数的代码:

$tPoint = DllStructCreate("long X; long Y")
DllCall("user32.dll", "none", "GetCursorPos", "ptr", DllStructGetPtr($tPoint))
ConsoleWrite("Cursor X position: " & DllStructGetData($tPoint, "X") & @CR)
ConsoleWrite("Cursor Y position: " & DllStructGetData($tPoint, "Y") & @CR)
---au3-----------------------------------------------------------------------------------------------------

这不要说初学者,估计有深厚编程基础的也看不懂了。



aardio 写同样的代码就非常简单:

var point = {
int x;
int y;
}

::User32.GetCursorPos(point)
1  2  3  4  5  6  7  8  9  10 ... 19  
关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1262 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 18:36 · PVG 02:36 · LAX 10:36 · JFK 13:36
♥ Do have faith in what you're doing.