傻瓜炒蛋 发表于 2024-1-12 21:41

用aardio开发一个剪切板词库收集器

本帖最后由 傻瓜炒蛋 于 2024-1-12 21:54 编辑

最近用影子输入法习惯了,里面有个很好用的功能:复制过的文本会保存在一个sqlite表里,可以直接在输入法里,选择这些复制过的文本。
后来一问,身边不少人有这些需求,但是又想换输入法。
然后我就想着自己能不能做一个。
趁着有空,就用aardio,先练习练习试着做一个。
大致效果如下,



带托盘,最小化后,隐藏在任务栏,只有一个图标


目前还没做好导出的功能,不过能进行简单的管理了

代码如下

import win.ui;
/*DSG{{*/
winform = win.form(text="剪切板词库收集器";right=656;bottom=432)
winform.add(
btnDelete={cls="button";text="删除选中";left=392;top=8;right=512;bottom=48;font=LOGFONT(h=-14);z=6};
choseid={cls="edit";left=349;top=18;right=372;bottom=42;edge=1;readonly=1;z=7};
expbutton={cls="button";text="导出词库";left=518;top=8;right=638;bottom=48;dr=1;dt=1;font=LOGFONT(h=-14);z=2};
listview={cls="listview";left=10;top=54;right=643;bottom=405;db=1;dl=1;dr=1;dt=1;edge=1;z=1};
numtxt={cls="static";left=103;top=21;right=133;bottom=37;color=8388608;dl=1;dt=1;font=LOGFONT(weight=700);transparent=1;z=5};
static={cls="static";text="今天新增";left=50;top=21;right=139;bottom=42;dl=1;dt=1;transparent=1;z=3};
static2={cls="static";text="个词语";left=136;top=21;right=225;bottom=42;dl=1;dt=1;transparent=1;z=4}
)
/*}}*/

import sqlite
import console;
import win.clip.viewer;
viewer = win.clip.viewer(winform);

var db = sqlite("/clipwords.db"); //创建数据库
if( not db.existsTable("historywords") ){
        db.exec( "CREATE TABLE (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `title`TEXT(400), year);"); //创建表本的数值
}

//剪切板动作开始
viewer.onDrawClipboard=function(){
        var str = win.clip.read();       
        //winform.choseid.text = str;
        console.clearScreen();
        console.log(str);
       
        //词语入库
        var cmd = db.prepare("REPLACE INTO historywords VALUES (@id, @title,@year);" )
        cmd.step(
                title = str;
                year = time.now();       
        )   
        load_db();               
        load_count();
       
}
//剪切板动作结束


import win.ui.grid;
var grid = win.ui.grid(winform.listview);//创建数据视图
grid.setReadonlyColumns(1);//可选设置禁止编辑的列,设为 -1 禁止编辑所有列
//grid.setColumns({"ID";"日期";"标题"}) //可选自定义显示列名
winform.listview.insertColumn("编号",40,,0/*_LVCFMT_LEFT*/)
winform.listview.insertColumn("标题",430,,0/*_LVCFMT_LEFT*/) //第二列开始可以使用_LVCFMT_CENTER居中
winform.listview.insertColumn("时间",250,,0/*_LVCFMT_LEFT*/) //第二列开始可以使用_LVCFMT_CENTER居中

//直接支持常用数据库的 getTable 函数返回的数据格式

function load_db(){
        var dataTable = db.getTable("SELECT * FROM order by id desc");
grid.setTable( dataTable )
}

//加载数据表
load_db();

function load_count(){
        var result= db.stepQuery("SELECT COUNT(id) as todaynum FROM historywords WHERE year >= date('now', 'localtime'); ")
        if(result){
                console.log(result.todaynum)
                winform.numtxt.text = result.todaynum;
        }
       
}

load_count();

//当前焦点项变更时触发此事件
winform.listview.onFocusedChanged = function(item,subItem,nmListView){
        winform.choseid.text = winform.listview.getItemText(item,subItem)
}
winform.show();

import win.ui.menu;
import win.util.tray;

winform.btnDelete.oncommand = function(id,event){
       
        db.exec("DELETE FROM ?? WHERE id=?;",{ "historywords",winform.choseid.text} );
       
        load_db();
        load_count();
        winform.choseid.text = winform.choseid.text-1;
}

winform.onMinimize = function(lParam){
        winform.tray = win.util.tray(winform);
        winform.tray.tip = "剪切板词库";//设置鼠标提示
        winform.tray.pop('隐藏在这里运行',"剪切板词库");
        winform.show(false); //隐藏窗口
        return true;//阻击默认消息传递,取消最小化过程

}
winform.onTrayMessage = {
        = function(wParam){
          //弹出托盘菜单以前,一定要前置主窗口中,避免不点击菜单不会消失,父窗口隐藏也要这样做
          win.setForeground(winform.hwnd)
             
                /*
                下面创建托盘弹出菜单。
                如果程序要开机启动到托盘,最好在这里创建菜单,在用户点击前不要创建菜单,
                避免系统启动时 DPI 缩放前创建的菜单字体偏小(出现这情况的机率很小)。
                如果不想重复创建菜单最好写到一个库里,然后在这里 import 即可避免上述问题。
                */
                import win.ui.menu;
               
                winform.popmenu = win.ui.popmenu(winform);//创建弹出菜单
                winform.popmenu.add('&主窗口',function(id){
                        //在下面输入菜单响应代码
                        winform.show(true);
                });
                winform.popmenu.add();//分隔线
                winform.popmenu.add('&退出',function(id){ winform.close() })          
          winform.popmenu.popup();
          winform.popmenu.close();
        };
        = function(wParam){
               
        };
        = function(wParam){
                        winform.show(true);
        };
        = function(wParam){
               
        };
        = function(wParam){
               
        };
}
return win.loopMessage();

YWQ8 发表于 2024-1-13 00:09

支持支持

42328669425 发表于 2024-1-13 00:12

支持,感谢开源

孤狼微博 发表于 2024-1-13 00:29

谢谢分享,这个开发工具挺方便的

keshi0 发表于 2024-1-13 01:04

顶起来!百度输入法无法手机、电脑同步,想换了

Zercher 发表于 2024-1-13 01:10

你们的电脑有win11吗? win 11 现在支持剪切板有历史记录了 快捷键是win + v

wasm2023 发表于 2024-1-13 08:50

感谢楼主分享,不错的思路

iooowjy 发表于 2024-1-13 09:14

这个想法不错,感谢楼主分享

1045837055lucy 发表于 2024-1-13 09:39

刚试了下,很实用。如果加上双击复制已保存的内容就更好了

小蓝人 发表于 2024-1-13 09:47

Zercher 发表于 2024-1-13 01:10
你们的电脑有win11吗? win 11 现在支持剪切板有历史记录了 快捷键是win + v
可以保存的记录,数量太少了。我现在用的是DITTO这个。可以保存好多条记录。
页: [1] 2
查看完整版本: 用aardio开发一个剪切板词库收集器