Since the author has taken down the website and forum, I’ve decided to create an archive of the program.
感谢
Rob在1月20号发布了最终版。作为10年的老用户,深感不舍。希望这里的讨论热度能够保持下去。
分享一个适合双显示器的快捷键, 可以让鼠标一键跳转到下一个屏幕中心
//默认热键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(); //让鼠标恢复正常
至于让窗口跳转到下一个屏幕, 无需代码,直接选择操作即可.
分享我写的智能识别剪贴板或选中内容脚本,希望楼主和各位大佬能将它更加完善
:
/*
=============================================
智能识别剪贴板或选中内容:
如果是正常内容,打开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;
}
请问一下, 能实现在一个脚本中调用另一个动作脚本吗? 就像调用宏那样.
是不是手势键除了程序提供的就没办法改其他的了?
顺便再请教一下, 如何侦测鼠标滚轮的滚动, 例如向上滚动几次这样
定义到快捷键,脚本中调用快捷键,也可以手势执行快捷键
滚动次数用在什么情况下
好的谢谢, 要是有类似import其他脚本的功能就好了
关于滚轮, 想问有没有类似 sp.IsButtonDown() 这种, 或者类似的语句, 用来检测滚轮的滚动
论坛关了现在学起来又更困难了
有监测鼠标上滚动和下滚动,窗口右边上下滚动那个例子,还有浏览器顶部标签页滚动切换
滚动次数没办法记录,随便滚动一下就出发几十次
请教一个问题。
我想做一个 StrokesPlus.net 脚本,用来在 Windows 资源管理器执行,获取当前目录路径,然后用来在 XYplorer 打开。现在已经卡在第一步,如何获取 Windows 的当前目录路径?
试试这个

大佬,咨询一下
第二部分案例的第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+的
嗯
有新消息吗,有没有出来,哪怕收费的
论坛关了找不到他了,我记得之前论坛有发过这个功能的,哎
请教一下strokesPlus支持异步吗? 我看它有async高亮, 但是不懂语法结构. 如果支持的话能麻烦教我一下可以吗? 例如打开文件
什么情况下打开文件要异步
如果我同时打开好多个文件夹, 而机械硬盘可能在休眠. 唤醒大概若干秒钟. 如果能返回一个确认状态再操作会好一些
另外该怎么判断打开的文件夹已经可以操作. 我试过DriveInfo.IsReady是不准确的 , 如果是用sp.AllApplications()提取文件夹然后进行比对来判断文件夹是否打开也不是太准确, 因为可能出现比对成功但是文件夹还不可以操作的情况. 用GetFiles应该是试验下来比较好的判断方法