Stroke 开源鼠标手势软件

软件名称

Stroke

应用平台

  • Windows

推荐类型

【开发者自荐】

一句简介

Stroke 是一款鼠标手势程序。它允许你通过划动鼠标来执行特定的操作。

应用简介

  • 开源。
  • 支持 C# 语言编写脚本,可使用 .NET Framework 及自己编写 dll。
  • 可对手势进行不断修正,使其变得平滑。

官方网站 && 应用商店地址

2 Likes

用了下,感觉思路是 好的,但是,现实的路子 走窄了。。。

  • 自定义的东西,全要靠自己编译 DLL ,这个就受众面太小了
    • 以我测试需要自己用 DLL 解决的 包括:新增手势,新增操作对象,新增对象动作等,感觉想要适配自己用,就必须要 编译DLL。。。

除了,不方便外,感觉目前程序可能有点 bug

  • win7 x64 , 对于 explorer 的操作有很多不能实现,比如 新建文件夹 新建窗口 ,已经给了管理员权限,还是不行

感觉如果要自己写DLL,应该至少给个教程示例;或者更简单 把库函数 扩充,弄成 脚本形式 也行。。。感觉目前 门槛太高 耗费的精力和得到的回报 不平衡。。。

注: 目前本人 用的是 MouseInc


@Qingwa 更新:MouseInc 有很多的杀毒软件报毒,请自行、谨慎考虑是否使用。

2020-09-14 修复了点击右键在某些情况下不能弹出右键菜单的问题。

没截图吗?

门槛太高啦

2020-09-23:
修正了编译脚本时的一个小 Bug。
Base.PressKeys(string keys),更改了转义符的方向(例如:/t:Tab 键)。
Base库新增了两个函数:
Base.IsKeyDown(Keys key):某个键是否按下。
Base.IsKeyToggled(Keys key):某键是否开启(例如:CapsLock)。

可自由引用程序集和命名空间,默认配置文件提供的命名空间有:“System”, “System.Collections”, “System.Collections.Concurrent”, “System.Collections.Generic”, “System.Collections.ObjectModel”, “System.Collections.Specialized”, “System.Diagnostics”, “System.Drawing”, “System.Drawing.Imaging”, “System.Drawing.Text”, “System.IO”, “System.IO.Compression”, “System.IO.Pipes”, “System.IO.Ports”, “System.Linq”, “System.Linq.Expressions”, “System.Media”, “System.Net”, “System.Net.Http”, “System.Net.Http.Headers”, “System.Net.Security”, “System.Net.Sockets”, “System.Reflection”, “System.Security”, “System.Security.Authentication”, “System.Security.Cryptography”, “System.Text”, “System.Text.RegularExpressions”, “System.Threading”, “System.Threading.Tasks”, “System.Timers”, “System.Web”, “System.Windows.Forms”, “System.Xml”, “System.Xml.Linq”, “System.Xml.Schema”, “System.Xml.Serialization”。

这里附赠一个百度翻译的脚本:

Base.Activate();
Base.PressKeys("(c)"); 
Thread.Sleep(4);
SynchronizationContext context = SynchronizationContext.Current;
string original = Clipboard.GetText().Replace("-\r\n", "").Replace("\r\n", " ");
(new Thread(new ThreadStart(() =>
{
    string q = original;
    string from = "en";
    string to = "zh";
    string appId = "";
    string salt = (new Random()).Next(100000).ToString();
    string secretKey = "";
    StringBuilder sb = new StringBuilder();
    foreach (byte b in MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(appId + q + salt + secretKey)))
    {
        sb.Append(b.ToString("x2"));
    }
    string sign = sb.ToString();
    string url = "http://api.fanyi.baidu.com/api/trans/vip/translate?";
    url += "q=" + HttpUtility.UrlEncode(q);
    url += "&from=" + from;
    url += "&to=" + to;
    url += "&appid=" + appId;
    url += "&salt=" + salt;
    url += "&sign=" + sign;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    request.ContentType = "text/html;charset=UTF-8";
    request.UserAgent = null;
    request.Timeout = 6000;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
    string result = streamReader.ReadToEnd();
    streamReader.Close();
    responseStream.Close();
    string translation = "";
    foreach (Match item in Regex.Matches(Regex.Match(result, "trans_result\":\\[.*\\]").Value, "{\"src\":\".*?\",\"dst\":\".*?\"}"))
    {
        translation += Regex.Unescape(Regex.Match(item.Value, "\"dst\":\".*\"").Value.Replace("\"dst\":", "")).Trim('\"');
    }
    if (translation != "")
    {
        context.Post((text) =>
        {
            Form form = new Form();
            form.FormBorderStyle = FormBorderStyle.None;
            form.StartPosition = FormStartPosition.Manual;
            form.Location = Cursor.Position;
            form.ControlBox = false;
            form.ShowIcon = false;
            form.ShowInTaskbar = false;
            form.BackColor = Color.White;
            form.Opacity = 0.96D;
            Label label = new Label();
            label.Text = (string)text;
            label.Font = new Font("宋体", 10.1f);
            label.MaximumSize = new Size(400, 1080);
            label.AutoSize = true;
            label.Location = new Point(4, 4);
            label.TextAlign = ContentAlignment.MiddleLeft;
            form.Controls.Add(label);
            form.MinimumSize = new Size(label.Width + 8, label.Height + 8);
            form.MaximumSize = form.MinimumSize;
            form.Size = form.MinimumSize;
            bool MoveWindow = false;
            int MoveX = Control.MousePosition.X;
            int MoveY = Control.MousePosition.Y;
            label.MouseDown += ((object sender, MouseEventArgs e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    MoveX = e.X;
                    MoveY = e.Y;
                    MoveWindow = true;
                }
                if (e.Button == MouseButtons.Right)
                {
                    form.Close();
                }
            });
            label.MouseMove += ((object sender, MouseEventArgs e) =>
            {
                if (MoveWindow == true)
                {
                    form.Location = new Point(Control.MousePosition.X - MoveX, Control.MousePosition.Y - MoveY);
                    return;
                }
            });
            label.MouseUp += ((object sender, MouseEventArgs e) =>
            {
                if (e.Button == MouseButtons.Left && MoveWindow == true)
                {
                    MoveWindow = false;
                }
            });
            label.MouseDoubleClick += ((object sender, MouseEventArgs e) =>
            {
                Clipboard.SetText(label.Text);
            });
            form.Show();
            form.TopMost = true;
        }, translation);
    }
}))).Start();

请前往 https://api.fanyi.baidu.com/api/trans/product/desktop?req=developer ,申请并获取以下两个值。
appId(APP ID)、secretKey(密钥) 。

请问运行之后,在哪里设置?

c#写插件对大多数人而言还是太困难了,毕竟程序员只是少数,用一些简单的脚本语言做扩展可能受众会更广。当然最广泛的受众还是那种一行代码都不会写的,最好你把所有的功能都提供好,只需要在设置里选择就行了。

不过每个人对手势软件的需求都不一样,考虑到每个方面是很困难的,比较现实的方式是提供一个公共的插件共享平台。当然以上讨论只是从如何推广这个软件的角度出发,如果作者本来只是以完成一个相对小众的工具为目标,自然也没必要在这些方面下太多的工夫。

2020-09-24

新增:在“配置”中鼠标中键点击手势画布可清除手势。
修改:调整了“配置”中手势图形的显示大小。
修复:在“配置”中未选中任何手势时修改手势引发的异常。

另外,忘了说明,插入或删除动作包、动作、手势都是对列表中已有手势点右键进行操作的。

截图:

v2-27a1d112b2e985f6db4fd73b7ef97ec2_hd

不过,复杂点的功能还是编译成 dll 比较好:

链接: https://pan.baidu.com/s/1RCBpbFf5Kz00DXa0cJGzGw 提取码: 45cp
(2020-09-30:使用 AddClipboardFormatListener 替换了 SetClipboardViewer 来解决长时间使用后可能由于未能处理好剪贴板消息导致翻译功能失效的问题。)
以上是百度翻译的 dll 版本,使用时放在和 Stroke.exe 同一目录下,使用以下脚本可实现以上的功能,同样需要填写你的“APP ID”和“密钥”:

BaiduTranslation.AppId = "";
BaiduTranslation.SecretKey = "";
BaiduTranslation.AwaitClipboardToTranslate();
Base.Activate();
Base.PressKeys("(c)");

鼠标左键可拖动译文,鼠标右键关闭,鼠标中键复制译文。

你还可以使用 AwaitClipboardToDisplay() 直接将选中的文字不翻译直接展示,功能就类似于一个文字剪贴板。

我 也曾经 怀疑过,,,但是 监控 24h ,它也没 明显 收集信息,也没联网,我也就用了。。。反正目前也没事。。。


主要是 目前 它最综合。。。没有一个能替代全部功能的

比如什么功能呢?
那个截图吗?交给更专业的截图软件做不是更爽吗?画一个框框即不快捷也不准确呀。如果要功能全面的截图软件推荐试试 snipaste,想要一个小巧的可以试试我的 Screenote,如果希望鼠标触发截图,用手势映射一个快捷键就是。
在四个角触发相应的功能,这里有个开源的 WinXcorners,而且实现起来不是挺简单嘛,勾一下鼠标,如果在四个角的范围就执行事件绑定的功能。
如果需要功能全面的鼠标手势,推荐一下 strokesplus。Stroke 来说分两种情况,如果你会写 C#,那么你可以实现几乎任何鼠标手势可以有的功能,如果你不会,Base 库确实很少的功能(以后估计也不会增加太多功能),因为它的设计初衷就是提供鼠标手势可能需要的最基本的功能。Stroke 的目标也不是做一个像 strokesplus 那样内置了各种功能的软件,而是一个小巧(配置好之后,你甚至可以把 Stroke.Configure.exe 删了)而反应灵敏的软件。
而你前面说的“新增手势,新增操作对象,新增对象动作等”这些功能真的是需要在运行时动态调整的刚需吗?会经常使用到吗?使用 Stroke.Configure.exe 来配置不是更简单吗?如果一定要实现这样的功能也不是不可以,相当于自己再实现一个“Stroke.Configure.exe”咯,然后执行你设定的手势调出配置的窗体。或者你直接执行“Stroke.Configure.exe”意思也差不多吧? :sweat_smile:

那么 Stroke 反应有多灵敏呢?从鼠标弹起,开始判别是否在任何动作包中触发了相应的动作,到执行手势完成,我们来看看花了多少时间(13 年买的 i5 笔记本)。
我们在以下两个位置插入记录时间的代码:


测试 5 轮结果如下,Ticks 是以 100 纳秒(1 ns = 10^(-9) s)为单位计数的:
Start:637372381902555779
End:637372381902595758
Start:637372381947865912
End:637372381947905872
Start:637372381966984207
End:637372381967024144
Start:637372381983986626
End:637372381984046605
Start:637372382038631758
End:637372382038661736
即 分别得到 39979、39960、39937、59979、29978,即大概是 4毫秒、4毫秒、4毫秒、6毫秒、3毫秒。(1秒 = 1000 毫秒)。
取决于你的使用滚轮的手速和火狐的反应,你可以:

是 整合。。。单独 我借助 其他软件 当然可以实现,关键是 整合。。。 200k左右文件,运行占有也仅有十几兆。。。功能又可以 实现平时常用软件的需求(当然,特殊需求还是会开其余软件),我觉得没什么可以替代产品。。。


您这个 Sroke 作为鼠标手势,基本已经成型了。。。如果想实现 这些 额外功能 我需要 用命令行参数的形式 去调用 其它软件 (而且,有的软件不给命令行。。。),运行结束后 还要退出 调用软件。。。这部分 时间会很久 还是不太方便。。。因此,从效率来看,我觉得 还是整合最优

Stroke 扩展性很好呀,你需要什么功能直接写脚本或者丢个dll进去都能用(就像上面那个百度翻译),不需要修改源代码,更不存在需要调命令行的情况呀。以上说了两个替代例子是它们各自都提供了完整的功能了呀,好像也没有什么需要和鼠标手势协同工作的场景吧?
个人觉得,把各种功能做到一个软件并不一定是好,举一个极端的例子,你需要一个软件即提供浏览器的功能又提供IM、下载管理、养成类小游戏、视频播放…集一体,但又不专业的软件吗(迅雷?)?

对啊。。。就比如 翻译。。。我要自己 写个轮子。。。有现成的可以调用 我为什么还要自己写一个? Stroke 扩展性是好,但是需要自己写。。。您的对象并不是一般用户,也不是我这种 懒惰 的代码爱好者。。。

mouseINC是联网的。 它的配置文件需要联网解析,当然了,你也可以强制本地解析。

我目前也在用。这种记录键盘鼠标的软件,被误报正常。

当然了,我并不是认为它一定安全,这个需要你们自己判断。

扩展的分享的多了,就会很好用的。

这个需要作者建立平台才好。

我之前一直在跟s+。net

帮助翻译中文。

但是后来慢慢放弃的主要原因就是,加载慢,启动慢。

楼主的这个我过几天尝试下会反馈一下个人体验给大家。

不需要吧。。。我断网试了下 可以修改配置?

浏览器缓存。。。这个我是没想到的,

  • 版本:2.10.21