StrokesPlus.net教程及脚本(官网和论坛已关闭)

Since the author has taken down the website and forum, I’ve decided to create an archive of the program.

2 个赞

感谢

Rob在1月20号发布了最终版。作为10年的老用户,深感不舍。希望这里的讨论热度能够保持下去。

1 个赞

分享一个适合双显示器的快捷键, 可以让鼠标一键跳转到下一个屏幕中心

//默认热键win+shift+C与小娜激活热键冲突. 但是小娜没用.可以用 openArk 删除热键

sp.SetMouseCursor("Arrow", "C:\\Windows\\Cursors\\aero_busy_xl.ani");  //让鼠标醒目显示
var screens = System.Windows.Forms.Screen.AllScreens;
var cursorPos = sp.GetCurrentMousePoint();

// 假设只有两个显示器,直接检查光标是否在第一个屏幕上
var currentScreenIndex = cursorPos.X < System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width ? 0 : 1;
var nextScreenIndex = (currentScreenIndex + 1) % screens.Length;

var nextScreen = screens[nextScreenIndex];

System.Windows.Forms.Cursor.Position = new System.Drawing.Point(nextScreen.Bounds.Left + nextScreen.Bounds.Width / 2,
                                                            nextScreen.Bounds.Top + nextScreen.Bounds.Height / 2);
sp.Sleep(500);
sp.ShowMouseCursor();    //让鼠标恢复正常

至于让窗口跳转到下一个屏幕, 无需代码,直接选择操作即可.

分享我写的智能识别剪贴板或选中内容脚本,希望楼主和各位大佬能将它更加完善 :sparkling_heart::

/*
=============================================
智能识别剪贴板或选中内容:
如果是正常内容,打开bing搜索
如果是链接,直接打开链接
如果是DOI号文本例如10.1109/TMAG.2018.2810199,直接打开对应网址:https://doi.org/10.1109/TMAG.2018.2810199
如果是快递号文本,直接使用百度搜索,百度会返回快递结果(废弃)
如果是文件&文件路径文本,直接打开对应的文件&文件路径
如果是AV、BV号文本,直接打开对应的B站网址
如果是磁力链接文本,直接打开默认下载程序进行下载
如果是注册表地址文本,打开注册表编辑器并跳转到对应地址(需要微软官方工具regjump,下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/regjump)
如果是.msc或.cpl后缀文本,为系统工具,直接打开。
如果包含网盘网址文本,百度网盘有提取码则自动填充,其他网盘会将提取码复制到剪贴板。
==============================================
*/
sp.Sleep(50);
var clipboard_saved = clip.GetText();
sp.Sleep(50);
sp.SendModifiedVKeys([vk.LCONTROL], [vk.VK_C]);
sp.Sleep(50);
var clipboard_selected = clip.GetText();

if (clipboard_saved === "") {
    sp.ShowBalloonTip('错误', 'Windows剪贴板没有内容,也没选中文本', 'Info', 2000);
} else {
    if (clipboard_saved !== "" && clipboard_selected === "") {
        clipboard_selected = clipboard_saved;
    }

    var keyword = clipboard_selected.trim();

    // 判断并处理不同类型的文本
    if (isDOINumber(keyword)) {
        // DOI号
        var doiUrl = "https://doi.org/" + keyword;
        sp.RunProgram(doiUrl, '', 'open', 'normal', true, false, false);
/*
    //快递号
    } else if (isExpressNumber(keyword)) {
        // 各家快递号一直变,导致需要一直更新很烦,快递号直接百度搜索就行了,暂时废弃。
        var expressUrl = "https://www.baidu.com/s?wd=" + encodeURIComponent(keyword);
        sp.RunProgram(expressUrl, '', 'open', 'normal', true, false, false);
*/
    } else if (isFilePath(keyword)) {
        // 文件路径
        sp.RunProgram(keyword, '', 'open', 'normal', true, false, false);
    } else if (isBilibiliVideoId(keyword)) {
        // B站AV/BV号
        var bilibiliUrl = "https://www.bilibili.com/video/" + keyword;
        sp.RunProgram(bilibiliUrl, '', 'open', 'normal', true, false, false);
    } else if (isMagnetLink(keyword)) {
        // 磁力链接
        sp.RunProgram(keyword, '', 'open', 'normal', true, false, false);
    } else if (isRegistryPath(keyword)) {
        // 注册表地址
        sp.RunProgram("C:\\Program Files\\Green\\regjump\\regjump.exe", keyword, 'open', 'normal', true, false, false);
    } else if (isMscFile(keyword)) {
        // 系统工具(.msc)
        sp.RunProgram(keyword, '', 'open', 'normal', true, false, false);
    } else if (isCplFile(keyword)) {
        // 控制面板工具(.cpl)
        sp.RunProgram('control.exe', keyword, '', 'normal', false, false, true);
    } else if (isNetDiskLink(keyword)) {
        // 网盘链接
        var netDiskUrl = processNetDiskLink(keyword);
        sp.RunProgram(netDiskUrl, '', 'open', 'normal', true, false, false);
    } else {
        var urlRegex = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i;
        var isUrl = urlRegex.test(keyword);

        if (isUrl) {
            if (!keyword.startsWith('http://') && !keyword.startsWith('https://')) {
                keyword = 'https://' + keyword;
            }
            sp.RunProgram(keyword, '', 'open', 'normal', true, false, false);
        } else {
            // 如果不是链接,直接进行搜索
            sp.RunProgram('https://www.bing.com/search?q=' + encodeURIComponent(keyword) + '&ie=utf-8', '', 'open', 'normal', true, false, false);
        }
    }
}

// 判断是否是DOI号
function isDOINumber(text) {
    var doiRegex = /^10\.\d{4,}\/\S+$/;
    return doiRegex.test(text);
}

/*
// 判断是否是快递号
function isExpressNumber(text) {
    // 圆通快递:YT + 13位数字
    if (/^YT\d{13}$/i.test(text)) return true;

    // 京东快递:JD + 1~2位字母 + 12位数字
    if (/^JD[A-Za-z]{1,2}\d{12}$/i.test(text)) return true;

    // 德邦快递:DPK + 12位数字
    if (/^DPK\d{12}$/i.test(text)) return true;

    // 德邦物流:DPL + 12位数字
    if (/^DPL\d{12}$/i.test(text)) return true;

    // 中通快递:78 + 14位数字
    if (/^78\d{12}$/i.test(text)) return true;

    // 申通快递:77 + 15位数字
    if (/^77\d{13}$/i.test(text)) return true;

    // 极兔快递:JT + 13位数字
    if (/^JT\d{13}$/i.test(text)) return true;
464183345936947
    // 韵达快递:43415 或 31250 + 15位数字
    if (/^(43415|31250)\d{10}$/i.test(text)) return true;

    // 顺丰快递:SF + 13位数字
    if (/^SF\d{13}$/i.test(text)) return true;

    // 邮政:98 + 13位数字
    if (/^98\d{11}$/i.test(text)) return true;

    // 如果不匹配任何规则,返回 false
    return false;
}
*/
// 判断是否是文件路径
function isFilePath(text) {
    var pathRegex = /^[A-Za-z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$/;
    return pathRegex.test(text);
}

// 判断是否是B站AV/BV号
function isBilibiliVideoId(text) {
    var bilibiliRegex = /^(av\d+|BV[A-Za-z0-9]+)$/i;
    return bilibiliRegex.test(text);
}

// 判断是否是磁力链接
function isMagnetLink(text) {
    var magnetRegex = /^magnet:\?xt=urn:btih:[A-Za-z0-9]+/i;
    return magnetRegex.test(text);
}

// 判断是否是注册表地址
function isRegistryPath(text) {
    var registryRegex = /^HKEY_(LOCAL_MACHINE|CURRENT_USER|CLASSES_ROOT|CURRENT_CONFIG|USERS)\\[a-zA-Z0-9_\\]+$|^HK(LM|CU|CR|CC|U)\\[a-zA-Z0-9_\\]+$/i;
    return registryRegex.test(text);
}

// 判断是否是 .msc 文件
function isMscFile(text) {
    var mscRegex = /\.msc$/i;
    return mscRegex.test(text);
}

// 判断是否是 .cpl 文件
function isCplFile(text) {
    var cplRegex = /\.cpl$/i;
    return cplRegex.test(text);
}

/*
// 清理网盘防爆链中的多余字符,如特殊符号、HTML标签等(废弃)
function cleanUrl(url) {
    var cleanRegex = /[^a-zA-Z0-9\/\:\.\-\_\?\=]/g;
    return url.replace(cleanRegex, '');
}
*/
// 判断是否包含网盘链接
function isNetDiskLink(text) {
    var netDiskRegex = /(pan\.baidu\.com|alipan\.com|weiyun\.com|lanzou\.com|drive\.uc\.cn|pan\.quark\.cn|jmj\.cc|115\.com|pan\.360\.cn|cloud\.189\.cn|cloud\.139\.com|pan\.xunlei\.com|pan\.123pan\.com|pan\.nutstore\.net|drive\.google\.com|dropbox\.com|onedrive\.live\.com|icloud\.com|mega\.nz|caiyun\.139\.com)/i;
    return netDiskRegex.test(text);
}
// 提取链接
function extractUrl(text) {
    // 首先尝试匹配完整的 HTTP 或 HTTPS 链接
    var fullUrlRegex = /https?:\/\/[^\s]+/i;
    var fullUrlMatch = fullUrlRegex.exec(text);

    if (fullUrlMatch) {
        return fullUrlMatch[0]; // 如果匹配到完整的链接,直接返回
    }

    // 如果没有匹配到完整的链接,尝试匹配没有协议前缀的链接
    var partialUrlRegex = /(?<!https?:\/\/)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\/[^\s]*/i;
    var partialUrlMatch = partialUrlRegex.exec(text);

    if (partialUrlMatch) {
        return "https://" + partialUrlMatch[0]; // 自动补充 https:// 前缀
    }

    return ''; // 如果没有匹配到任何内容,返回空字符串
}

// 提取提取码
function extractPassword(text) {
    var passwordRegex = /(?:提取码|提取)[::]\s*(\w{4})/i;
    var passwordMatch = passwordRegex.exec(text);
    return passwordMatch ? passwordMatch[1] : '';
}

// 处理网盘链接(提取密码并生成完整链接或复制到剪贴板)
function processNetDiskLink(text) {
    var password = extractPassword(text); // 提取提取码
    var url = extractUrl(text); // 提取链接
    if (password && url) {
        if (url.includes("pan.baidu.com")) {
            // 处理百度网盘链接:嵌入提取码
            url = url.split("?")[0] + "?pwd=" + password;
        } else {
            // 处理其他网盘链接,复制提取码到剪贴板
            clip.SetText(password); 
            sp.ShowBalloonTip(`提取码:${password}`, `已复制到剪贴板`, 'Info', 3000);
        }
    }

    return url;
}
1 个赞

请问一下, 能实现在一个脚本中调用另一个动作脚本吗? 就像调用宏那样.
是不是手势键除了程序提供的就没办法改其他的了?
顺便再请教一下, 如何侦测鼠标滚轮的滚动, 例如向上滚动几次这样

定义到快捷键,脚本中调用快捷键,也可以手势执行快捷键

滚动次数用在什么情况下

好的谢谢, 要是有类似import其他脚本的功能就好了
关于滚轮, 想问有没有类似 sp.IsButtonDown() 这种, 或者类似的语句, 用来检测滚轮的滚动
论坛关了现在学起来又更困难了

有监测鼠标上滚动和下滚动,窗口右边上下滚动那个例子,还有浏览器顶部标签页滚动切换

滚动次数没办法记录,随便滚动一下就出发几十次

请教一个问题。
我想做一个 StrokesPlus.net 脚本,用来在 Windows 资源管理器执行,获取当前目录路径,然后用来在 XYplorer 打开。现在已经卡在第一步,如何获取 Windows 的当前目录路径?

1 个赞

试试这个

大佬,咨询一下
第二部分案例的第7个代码还有吗,论坛里好像找不到

位置

    var wndspLocation = mouseWnd.Location;
        wndspLocation.X = 883;
        wndspLocation.Y = 515;
        mouseWnd.Location = wndspLocation;

尺寸

        mouseWnd.Size = new Size(800, 550);
        mouseWnd.Center();

大佬能否实现这个功能,右键+左键点击窗口,拖动鼠标可以直接调整窗口的大小
这是autohotkey的实现此功能的代码
~Rbutton & Lbutton::

setWinDelay,0
CoordMode,mouse,Screen

Sleep,200
MouseGetPos,mx1,my1
WinGetPos,winx,winy,winw,winh,A
loop{
;GetKeyState,vstate,LAlt,p
GetKeyState,vstate,Rbutton,p
if vstate=U
break
MouseGetPos,mx2,my2
xx= winw + mx2 - mx1 yy= winh + my2 - my1
winmove,A,winx,winy,xx,yy
sleep,50
}

return

要是rob在,要他转换下就好了

你问问AI,把ahk发他,看能不能跟你搞个s+的

嗯
有新消息吗,有没有出来,哪怕收费的

论坛关了找不到他了,我记得之前论坛有发过这个功能的,哎

1 个赞

请教一下strokesPlus支持异步吗? 我看它有async高亮, 但是不懂语法结构. 如果支持的话能麻烦教我一下可以吗? 例如打开文件

什么情况下打开文件要异步

如果我同时打开好多个文件夹, 而机械硬盘可能在休眠. 唤醒大概若干秒钟. 如果能返回一个确认状态再操作会好一些
另外该怎么判断打开的文件夹已经可以操作. 我试过DriveInfo.IsReady是不准确的 , 如果是用sp.AllApplications()提取文件夹然后进行比对来判断文件夹是否打开也不是太准确, 因为可能出现比对成功但是文件夹还不可以操作的情况. 用GetFiles应该是试验下来比较好的判断方法

1 个赞