Stroke 开源鼠标手势软件

作为鼠标手势来说,基础的功能在 Base 库已经提供了嘛(而且也提供了一个可用的配置文件),并不是所有东西都需要自己写呀,所以对于一般用户来说基本需求应该是可以满足的呀。
所有功能肯定都是需要人去实现的,区别就在于是作者把它们写死在软件里面(耦合性重),还是通过编写新的库(基本0耦合,Stroke 本身不依赖库,库也不依赖 Stroke,脚本可能依赖库)去实现(类似那个百度翻译的库,其他软件也是可以使用的呀,反过来说,其他软件使用的库也可以被 Stroke 使用)。Stroke 本身只是涉及到鼠标手势本身的逻辑,比如手势的识别、动作和动作包的组织等,促发动作(脚本)但不涉及到具体触发什么,因为动作是用脚本描述的,而脚本是由用户编写的。
这样有一个好处就是,即使你在软件本身提供了再多的功能,总会有人的需求不能得到满足,如果不提供类似的扩展方式,那么那个需求就变得不可能。即使软件本身不具备任何功能(Stroke),只要扩展的方式足够自由,那么就能最大化为实现那个功能提供可能性。
不过,考虑到安全性的问题,不推荐使用未开源的第三方库。

期待你的测评,哈哈哈哈。

看后面的讨论,原来主要卖点是灵敏,我觉得这个亮点还是挺吸引人的,建议楼主在宣传的时候可以多强调一下这一点。市面上鼠标手势的软件已经很多了,总还是要突出一下优点才能吸引用户。

嗯嗯,有道理。不过也不求这个软件能有多少用户量,因为鼠标手势这个东西本身就比较小众,加上会 C# 的人好像没有一些 js 之类的脚本语言的多,大家看到可能都不太愿意去尝试。软件也都是开源的,如果真的要推广的话太花精力,随缘吧,哈哈哈哈。要是觉得有用,随手点颗星星就行。

试用了一下,感觉还是不错的,确实反应很快,运行后托盘中也没有图标这个设计我很喜欢(虽然这导致退出程序会稍显麻烦)。简单的提几个建议:

  1. 轨迹显示的位置和鼠标不一致(由于我有两个显示器,缩放比例设置的还不一样,所以我不确定是哪个原因导致的,我这里的表现是离左上角越远,偏差就越大)
  2. PressKeys似乎只支持字母数字和修饰键,键盘上其他的标点、F区之类的也能支持就好了
  3. 既然没有托盘图标,那Base库里最好加上禁用/启用手势和退出程序的功能吧
  4. 新增手势的操作逻辑有点迷惑,没太看懂

主要的问题还是基础设施太简陋,不过有Base.Run的话,用户完全可以引入外部的脚本来扩充功能,所以也还可以接受。

关于 1,请问你使用的是“ 2020-09-24”这个版本吗?如果是的话,我暂时也不太确定问题出在哪里。app.manifest 里已经设置了:
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
按理说绘制轨迹的窗体应该不会受到缩放的影响。我这里使用了一个显示器,运行 Stroke 后调整显示比例之后会有错位的情况,这时候重启 Stroke 就没有问题了。待会测测两个显示器。
关于 2,由于 PressKeys 对于修饰键、数字、英文字母以外的键是使用 / 来转义的,这就意味着其后只能有一个标志来代表它的含义,使用这种方式处理有24个的功能键似乎不太合适。例如 /F12 是应该解释成 F1 和 2 还是 F12 呢?它需要一个结束符来标记,但我不希望有结束符。因此我准备新增一个 PressKey 的函数,它接收一个 Keys 类型的参数,实现 Base.KeyDown(Keys key) 并 Base.KeyUp(Keys key) 的功能。或者我考虑给 PressKeys 增加一个 #FF 这样的新符号,对应 256 个虚拟键码。
关于 3,执行脚本需要使用手势触发,如果增加启用和禁用手势的话,一旦禁用了手势,又如何执行启用手势的脚本呢?如需退出 Stroke,执行 Application.Exit(); 即可,这个是 .Net Framework 提供的函数,可以直接使用。
关于 4,新增手势就是在你需要在插入手势的位置的前面那个手势点右键,然后点添加就新增了,新增之后填写好手势的名称,然后对下面那个空白的画布点鼠标左键或者右键就可以开始画手势了,用的就是你设置好的触发鼠标手势的那个键来画(一般是右键),画完之后可以多画几次,这样算法会根据历史来修正它。如果觉得画得不好,可以用中键点画布清除。

刚使用两台显示器测试了一下,调成了不同的缩放比例并没有发现问题喔。由于绘制轨迹的窗体本身并不响应缩放,因此,如果调整了缩放比例就需要重启 Stroke,不然就可能出现你说的那种情况了。

2020-10-07

新增:Base.PressKeys(string keys) 支持以#FF(两位十六进制数)的形式来输入 Windows 虚拟键。具体键码查看 Keys.xlsx

不过我这里确实存在这种问题,并不是在我打开程序后调整了缩放比例才出现的问题。

刚才试了一下各种情况,总结出以下规律:

我有两个显示器,A和B,当B做主显示器时,不论怎么设置都没问题;当A做主显示器时,如果B的缩放率不是100%,轨迹的位置就对不上鼠标,而且与A的缩放率无关(每次调整显示设置之后我都确保重启了Stroke)。

所以可能和显示器本身有关系(A显示器型号比较旧)。不过这个问题其实不太要紧,只是反馈一下。

嗯嗯,好的,感谢反馈。不过我复现不了这个问题,也暂时想不到是什么原因造成的…

我今天试用了一下,虽然是net框架,但是内存占用5.7m还是很少的。

速度很快,应该是我用过的最快的鼠标手势。(这个可以加入广告词) :joy:

鼠标手势软件太多了,所以突出优势的前提下,还希望能加强交互逻辑和普通人的易用性。
所以我提几个建议啊。

1。 config的交互逻辑

第一排3个按钮点击后,会弹出新窗口。 绝大多数的鼠标手势配置界面, 更多采用了tab控件,这个从交互逻辑上更符合直觉。

而且同一个form下,数据相互传递也更方便。 所以建议配置程序采用单窗口模式,除了确认不要再弹窗。至于如何设计元素的摆放,还需要作者考量。

2.手势
我添加了一个e,但是并没有达到像上图演示的效果。而且列表中还丢失了一个手势。

这里应该是有bug。

  1. 代码直觉

既然是c#语言, 但是按键发送修饰键的语法真的好奇怪。

Base.PressKeys(string keys):允许你执行一串按键序列操作。以下列出该函数所支持的所有字符(不区分大小写)及其含义:

  • 所有英文字母和数字:按下并弹起对应的键。
  • 修饰键:
    • (:按下 Ctrl 键。
    • ):弹起 Ctrl 键。
    • [:按下 Shift 键。
    • ]:弹起 Shift 键。
    • {:按下 Alt 键。
    • }:弹起 Alt 键。
    • <:按下 Win 键。
    • :弹起 Win 键。

当然了,这种设计我倒是觉得很精巧,只是对于c#语法来说,并不符合直觉。不过用户经过学习也可以接受。

主要是代码写错后,运行主程序,会报错,但是报错并未指出出错位置和行号。

交互界面上,短期内实现代码关键字即时提示可能有难度,但是可以把文档的按钮加上,方便用户快速打开文档查找代码关键字。

  1. 目前最新版运行config后,会自动关闭主程序, 我建议增加一个关闭config后自动运行主程序的功能。 这样两个程序也可以比较顺畅的衔接上。不用每次配置后手动打开主程序。

另外托盘图标还有存在的必要性,比如临时禁用时可以观察状态。也可以确认程序是否在运行中。

总的来说, 速度快这个就很打动人,比如我之前说过的s+.net 就有功能太强大后载入慢这个问题。

这个软件的发展前景非常好,只要平衡好用户易用性,改善交互逻辑,肯定会大受欢迎的。

@xiaokonglong 感谢建议,配置程序的设计是比较简陋,主要考虑到用户可能只会用几次,个人精力也比较有限,所以没有花很多心思,只考虑实现一个简单可用尽可能没有 Bug 的。
关于 1,由于那几个设置占用的屏幕空间不一样大,比如画笔设置内容很少,如果使用 tab 的话,那一页就会很空、不好看,所以使用了目前的方式交互。
关于 2,由于我没有写比较完善的教程,用户可能不太理解画手势的操作方式。使用鼠标左键或者右键点击那个画布之后,屏幕会被一层白色半透明的窗体遮盖,此时就可以开始画手势了,使用你设置的那个鼠标按键来画,从按键按下开始到按键弹起结束,需要更正的话,直接再操作一次就可以了,它会变得更平滑一些。左侧显示的是手势的名称,和手势具体的形状无关喔。如果没有画好,可以用鼠标中键点击画布清除手势图形。截图中圈出的地方是一个手势名称空白的手势。
关于 3,Base.PressKeys 的参数是接收一个字符串嘛,字符串的内容和 C# 的语法是没有关系的。这个用法是我自己的设计,所以会比较独特一些。不推荐直接在配置程序中写代码,因为它没有任何提示、很不方便。除非是简单的几行代码,有足够的信心保证它不会出错,否则推荐使用 Visual Studio 编写,再粘贴到配置程序的文本框中。是有考虑在配置程序的代码框旁边中加入一个检查代码的按钮,这样就可以在运行 Stroke 之前发现错误。
关于 4,之前有采用过关闭配置程序后自动执行 Stroke 的方式。但是后来考虑到,有可能用户需要使用管理员身份运行或者不想使用管理员身份运行,而且配置程序就在 Stroke.exe 旁边(操作起来也并不太麻烦),所以取消了这种方式。

空白名称无法用鼠标点击,只能键盘移动。

鼠标手势我搞清楚了, 必须中键清除后再画,否则无法更改。 这也是我认为无法识别的原因。

嗯?应该是可以点击呀(因为没有文字,所以可以响应点击事件的区域比较小,在那个范围多点几次试试),点击之后你观察一下右侧,如果有变化说明已经点到了。只是名称是空白嘛,所以左侧不会有选中的文字所以也不会出现蓝色的底色了。
如果画得不好可以直接清除,但是再多画几次也是可以的,只不过它是通过指数近因加权平均来修正的,历史占90%当前占10%。如果一开始就非常偏离目标,那么修正起来可能会很困难,比如需要十次、二十次才会达到你想要的效果。

2020-10-10

base 库新增置顶有关的三个函数:

  • Base.IsTopmost():当前操作的窗体是否置顶。
  • Base.TopmostOn():置顶当前操作的窗体。
  • Base.TopmostOff():取消置顶当前操作的窗体。

你好!运行stroke后,windows10在有打开的最大化的窗口时,自动隐藏的任务栏,无法自动弹起,麻烦能解决一下!多谢

你好,没太明白你的描述。可以截图说明一下吗?


就是我的任务栏设置的是自动隐藏,鼠标滑过任务栏位置时能自动弹出,但运行stroke后并且有打开的全屏窗口时,鼠标滑过底部时任务栏时不能自动弹出了

好的,感谢反馈,问题已经解决了。晚些时候我会发布新的版本。
这个问题是这样的,当你使用自动隐藏任务栏的时候,实际上任务栏会保留一个像素的宽度,并且置顶。这时候你的鼠标移动到它上面,任务栏就能检测到然后恢复正常的宽度……Windows的这个实现会存在一种问题,就是如果有其他置顶的窗体覆盖它(即使是透明的、且鼠标穿透的),被覆盖的部分它就失去了置顶的属性,这时候如果有窗体遮盖它,它就不能检测到鼠标移动到一像素宽度的任务栏上,因此也不会弹出来了。
Stroke 原本没有考虑到这个问题,是始终置顶的,现在改成画手势的时候才置顶就没问题了。

建议加入高分屏支持(dpi感知), 这两天刚学 :joy:
透明窗口可以考虑只放到Workarea,任务栏基本也不会有人去画。