Stroke 开源鼠标手势软件

用这个支持触摸板手势的软件,结合strokesplusnet,已经基本上触摸板手势替代所有鼠标手势了,包括关闭显示屏,连续上下切换程序窗口等,非常强大

鼠标手势还是继续用s+net

1 个赞

无法回去顶部/底部
回到顶部: 向左+向上,浏览器无响应



#36 是数字键6喔,如果你想按 Home 那就是#24,是看十六进制。

今天更新的版本2020-12-20已支持在用户规定的程序中禁用 Stroke。
在“过滤设置”中按下“添加路径”不放,然后把十字光标拖放到需要禁用的程序界面上。此时列表会添加该程序的路径的正则表达式。
旧版本的配置文件不能在2020-12-20版本直接使用,需使用新版的配置程序来配置一次旧版本的配置文件(放在同目录下,然后运行新版本的配置程序),才能正常使用。

请问像“搜索选中文字”这种,作者是怎么操作的呢?

我不会编程,所以是从mouseinc那里照搬来。
Base.PressKeys(“( c)”);
Base.Run(“https://www.baidu.com/s?ie=UTF-8&wd=%ClipBoard.GetText%”);
没达到效果,搜索了“c# ClipBoard",也看不明白 :laughing:

@sol123

Base.PressKeys("(c)");
Thread.Sleep(100);
Base.Run("firefox.exe","\"www.baidu.com/s?wd="+Clipboard.GetText()+"\"");

让线程暂停100毫秒是为了保证能正确的读取剪贴板的内容。这个数字可以根据你机器的情况适当的调整。
Base.Run 的第一个参数这里填写了 firefox.exe,你也可以换成其它浏览器(如果没有加入环境变量的话就需要填写完整的可执行程序路径),后面的网址是作为参数传给 firefox 的,同样如果你有其他需求也可以查看相关的文档,看看浏览器支持什么参数。
复制文字到剪贴板再通过 Clipboard.GetText() 获取剪贴板的文本并不总是能够无缝协作的,因此这里才设置了100毫秒的等待时间,如果希望达到更快速的响应,可以参考我上面提供的百度翻译的库,使用 Win32 API 提供的“AddClipboardFormatListener”。

非常感谢! 100、10毫秒没感觉出区别。 库啥的对来我说是天书了 :sweat_smile:

另外请问边缘滚动的有样板吗? 音量调节,默认的右+左+滚轮,需要3个手指,不习惯,因为我是无名指和小指都用来稳定鼠标(为此还查了“ 右键 中指 无名指”这种问题 :rofl:)。

@sol123
发手势的按键按下是必须的操作,比如你如果设定的是鼠标右键,那么你想使用 Stroke 时右键按下是必须的。
判断触发手势时的位置可以使用 Base.KeyPoint 的位置来判断。

if(Base.KeyPoint.X < 50 && Base.KeyPoint.Y > 1030)
{
    MessageBox.Show("OK!");
}

以上代码展示了 1080p 屏幕的左下角边长 50px 的方形区域。如需要适配不同屏幕的大小,可以考虑使用 Screen.PrimaryScreen.Bounds 等方式获取屏幕尺寸。

请问能否使用ImmGetConversionStatus() 识别当前输入法中英文状态呢

可以的,不过脚本实际插入的位置是方法体内,不可以声明外部方法,所以对于 C++ 写的 dll 需要再用 C# 写一个 dll 包装一下。

在做别的的时候尝试过,结果是不行的,目前没有找到有API可以获取其他进程的输入法状态(早期有,不过新版的win10已经不支持了)。

he ImmXXX methods on a window must be executed in the process owning that window .

https://social.msdn.microsoft.com/Forums/en-US/8a781fb0-ba77-48cd-89c1-b210266ba7cb/immgetcontext-always-returns-null?forum=windowsgeneraldevelopmentissues

mmGetContext cannot get input context of other process. ImmGetContext internally checks whether the process of the target window is the current process. If the check fails, the function returns NULL.

SOLUTION

You need to inject a dll into the target process, and get the input context in-proc.

2020-04-18:
修复了 Base 库中存在的一个问题:当动作执行的过程中窗体的句柄已经被销毁时,程序可能进入死循环。

更新目标框架为 .NET Framework 4.8。

2021-04-19:
更正了 Win32 API 中的一些类型错误。
Base 库中新增以下函数:

  • Base.GetWindowClassName(IntPtr handle = default):获取窗体的类名。
  • Base.GetWindowText(IntPtr handle = default):获取窗体的标题。
  • Base.GetWindowProcessId(IntPtr handle = default):获取创建窗体的进程的 ID。

Base 库中所有关于窗体的函数支持可选参数 handle,若不传入则默认为当前操作的窗体。

请问“\”键怎么表示,“\”吗,
浏览器的焦点如果在地址栏的话,“home”“end”怎么才能到达页首或页末

@fcpeacock
这个键是反斜杠,在 Base.PressKeys 中不支持直接用字符表示,但是所有 Windows 支持的按键都可以在这个函数中用键码的方式表示,具体可以查看项目主页中的说明文档,其中反斜杠是 #E2。

焦点在地址栏的话按键盘上的这两个键当然无法调整页面的位置啦,就和你直接按键盘上的这两个键是同一个道理,你需要先把焦点切换到页面上去。如果想再把焦点调回地址栏浏览器通常也有相应的快捷键,并不是很麻烦的事情。

如果你的浏览器有调整页面位置的快捷键也可以试试。这种情况应该不限于焦点在地址栏中。

请教一下,Firefox和edge都用F6来切换地址栏和页面焦点(按2次和3次),有什么办法可以判断焦点的位置呢
还有就是在total commander中使用手势的时候,怎么判断哪半边处于激活状态呢,因为需要操作的面板可能和当前激活的面板不同

你可以考虑使用 Base.KeyPoint 来获取手势的起点,然后使用 WIN32API 的 WindowFromPoint 函数获取控件,再使用 SetFocus 来使控件获得焦点。这样可以使得手势起点的位置的控件获得焦点。

如果你只想获取焦点的位置可以使用 GetFocus 获取具有焦点的控件的句柄,然后使用 GetWindowRect 就能获取控件的位置。

如果你还需要判断是处于父窗体的什么位置,这个就需要根据具体的窗体而定了,可以考虑使用 GetAncestor 去获取父窗体的句柄,然后你在比较这两个矩形,根据情况达到你想要的效果。

打扰了。。。
还有就是全屏玩游戏时,尽管已经屏蔽了游戏程序,使用右键时还有问题,使用右键点击进行移动的游戏,点击右键一次之后,人物会一直跟随鼠标进行移动,而不是点击一次移动一次

@fcpeacock
好的,谢谢反馈。
刚刚更新了,看是否解决了这个问题。