Stroke 开源鼠标手势软件

可以了,谢谢

好像 ctrl + shift + up arrow 没有办法设置,设置出来和 ctrl + up 是一样的?
Base.Activate();
Base.PressKeys(“([#26])”);

嗯,测试了一下,的确有这个问题,但是 ctrl + shift + N,没有问题说明可能不是 ctrl + shift 不能触发的原因。同时,Base.PressKeys("([#4E])"); 也能够触发 ctrl + shift + N。最近时间比较紧,暂时不能解决这个问题。

这个 bug 的原因已经找到了,Up 属于扩展键 KEYEVENTF.EXTENDEDKEY,似乎所有按键加上这个 flag 都没有问题,稍后会更新 release。

你发现的问题和 @songzhenhe 发现的是同一个问题,已解决。

已从GitHub下载最新版本,问题已经解决,多谢

发现一个显示的问题:打开软件的时候,底部会有一条透明的线,可以看到其他的应用窗口。在通知区域图标点击右键,也会出现。使用手势关闭标签时,也会出现。其他的都挺好的。如果能默认管理员运行就好了,半路出家,没整过C。

我这里复现不出来这个问题,如果是透明的线,那那里有窗体吗?是透明的窗体?还是窗体调整了位置留下一行像素的距离?

为什么我不能操作某些窗体(例如:任务管理器)? 由于 Stroke 选择了 uiAccess=“false” 设置,你需要使用管理员权限运行 Stroke 时才能与这些界面交互。

我想开机就运行 Stroke,我该怎么做? 我推荐以下两种方式,可以根据你的需求进行选择。 第一种,使用任务计划程序,在常规选项卡勾选“使用最高权限运行”,触发器选择“登录时”,操作选择“启动程序”(注意:起始位置必须填写 Stroke.exe 所在的目录)。 第二种,将配置文件“Stroke/app.manifest”内的 uiAccess 属性设置为 true,编译并对程序进行签名,然后将整个目录放入“C:\Program Files”内,最后将 Stroke.exe 的快捷方式放入启动目录(shell:startup)。

很奇怪的现象,关了软件就好了。
不是透明的线,感觉就是任务栏有一段距离透明了,可以看到上一个软件的窗体。
目前发现不是所有的软件都会出这种情况,我看了下我自己目前用到的,如果打开企业微信最大化,然后打开浏览器最大化,这个时候在通知区域找个qq音乐之类的其他软件,点击右键,就必出。
您可以试试看看是否可以复现。
下面两张图,一张正常,一张通知区域右键(执行关闭标签之类操作也会触发)


我明白了,我把两张图片对齐了一下,发现是点击右键的时候任务栏缺了一部分。分析了一下代码,由于 Stroke 需要显示手势线条,所以画的时候必须置顶(this.TopMost = true;),然后松开鼠标手势键的时候取消置顶。Stroke 的窗体是占满整个屏幕完全透明,且不可点击的,因此不会直接产生你描述的现象。
但是,任务栏本身是置顶的,在Stroke置顶之后,似乎对任务栏的置顶属性产生了影响,使得它好像未能置顶了,这时候如果有其他窗体最大化了,并且那个窗体实际上有一层自己绘制的透明阴影,就可能产生你描述的现象。如果你使用火狐(没有透明的阴影)最大化,就会看到火狐遮盖了部分的任务栏。
总结一下,Stroke 要置顶来现实手势,置顶这个操作似乎影响了任务栏。其他窗体遮盖了部分的任务栏。
要解决这个问题,可能就是Stroke不使用“this.TopMost = true;”这句代码,不确定使用WIN32API 是否可以避免这个问题,有时间的话我会试试。

好的,大神辛苦

不过,感觉可能不会成功,如果我没有记错的话,置顶属性好像是这样的:
某个像素都会判断是那个窗体置顶了,且最后置顶的窗体能够真正的置顶。也就是说,Stroke置顶之后,由于占满了整个屏幕,那么其他窗体的置顶属性实际上就失去了作用。你可以尝试让某个窗体置顶(默认手势是:左右键同时按下后向右上角划),然后使用alt+空格,选择移动窗体,你就会发现这个窗体能够遮挡任务栏。如果这个是一个透明的窗体,那你就应该能看到任务栏下面的窗体(如果不考虑置顶属性,那个窗体实际在任务栏之上的话)。
如果其他鼠标手势软件不会产生这个问题,那有可能是它的画布没有覆盖到任务栏,但是我觉得应该要覆盖任务栏。所以,这个可能是Windows 置顶机制的问题。

如果Stroke不使用置顶属性的话,又会有另一个问题,就是在有置顶窗体的部分,看不到画的手势了。

我看下了下原来用到的WGestures,画布应该是全屏的,可以画到任务栏上

还有个现象,杀掉进程,然后直接双击打开应用,不进行其他任何操作,也会出现同样问题

那试试置顶一个窗体,它能不能画在上面?

还有一种可能,它的画布可能不是自己创建的窗体,而是屏幕本身。

刚试了下,是可以的。

yingDev/WGestures: Modern mouse gestures for Windows. (C#) (github.com)
这个是他的源码,您可以研究下,我看不懂

噢,我看看他的代码。

他的实际上也置顶了,使用的是WIN32API的 SetWindowPos,我在 Base 里置顶别的窗体也是使用这个方法。

我试了试,用这个方法置顶。发现效果没有什么区别。猜测可能是窗体扩展样式的问题。我先试试。

原因找到了……
不知道当时怎么想的,在每次显示的时候我都设置了扩展样式……

应该是没有必要的,稍后更新。

大神就是牛!