rexdf / CommandTrayHost

A command line program monitor systray for Windows

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

刚需(help),Diy一个功能!关于热键呼出

lirener opened this issue · comments

刚需(help),Diy一个功能!关于热键呼出
在V2ex看到原帖https://www.v2ex.com/t/410279
关于22#提出的刚需功能请求~因为准备挂机windows的脚本 多开cmd
所以需要 自定义热键(最好能自己多个设置的) 一键呼出多个(最好能自定义合成的)cmd窗口

在v2ex回复中有纰漏 原来我以为点托盘能一次性呼出所有已启动的cmd窗口 原来只能主程序的……
其实现在就是需要一个一次性呼出多个cmd窗口的+个老板键的热键 方便查看所有和隐藏到托盘……
如果支持以后 再支持多热键 比如QQ多开那样 不同的热键呼出不同多个窗口 那就更好了

commented

是有在考虑热键功能

目前我考虑的有两个功能,一个是热键支持,一个是定时计划任务功能。但是我还没考虑好怎么定义配置格式。

这个完全是个顺手写出来的,Windows API我也不大熟,摸着石头过河写出来的,其实大部分代码都是StackOverflow里面copy出来的。

没事慢慢来 我等你啊 等你写好我还能帮你测试反馈BUG呢

commented

可以呼出全部的啊 鼠标左键单击那个是CommandTrayHost本体。

呼出全部在全部子菜单里面

好吧 ……看到了在全部里面 操作起来有点不是很方便~来个热键应该就完美了
能分开来 什么热键 显示/隐藏 哪些 这样组的热键

commented

我这里的情况是有大约十来个被监控着,一旦显示就占满任务栏。 大都是kcptun v2ray之类的 都是一旦启动就会一直跑,大部分时候不关心它的输出, 所以就搞成静默启动了。

话说经常要显示的是什么情况?当做开始菜单在用了?

tracker……caddy(准备找作者了现在要命令才能打印日志默认不打印)……
bt
https 1
https 2

commented

也许除了热键 甚至把鼠标左键都可以自定义一下?比如点一下左键变成显示指定的几个程序?

可以啊 在设置里面可以配置显示某个组的话也很有用 然后热键也可以快速显示某个组

commented

不过你这几个图看上去好高级 这是黑产的工具么?

newgame
噗~BT和http命令是自己整合写的快速启动*.bat命令 另一个tail是linux的命令msys64嵌入linux内核for windows
2332
2333

commented

哈哈

试试最新版的,添加了左键单击自定义功能。

default

妙啊~我去试试……哈哈 这应该可以够我用好一阵子的了

prprpr
谢谢你!这个小东西超好用的!prprpr~
091 _k i r60k 0kzret

commented

刚刚加了个可以自定窗口初始位置的功能,感觉也许会有点用处

额 有用的 因为我发现开机启动以后他都会重新排位置~但是这个要是能自动记录变成另一个配置文件就好了 然后去读取那个配置

commented

那就用百分比的方式 "position": [0.1,0.1], "size": [0.25,0.25], 加一行这个,然后把位置调一下百分比

default
不太懂

commented
{
    "name": "cmd例子1",
    "path": "C:\\Windows\\System32",
    "cmd": "cmd.exe",
    "working_directory": "",
    "addition_env_path": "",
    "use_builtin_console": false,
    "is_gui": false,
    "enabled": true,
    "position": [10,10],
    "size": [500,500],
},
{
    "name": "cmd例子2",
    "path": "C:\\Windows\\System32",
    "cmd": "cmd.exe",
    "working_directory": "",
    "addition_env_path": "",
    "use_builtin_console": false,
    "is_gui": false,
    "enabled": true,
    "position": [520,10],
    "size": [500,500],
},
{
    "name": "cmd例子3",
    "path": "C:\\Windows\\System32",
    "cmd": "cmd.exe",
    "working_directory": "",
    "addition_env_path": "",
    "use_builtin_console": false,
    "is_gui": false,
    "enabled": true,
    "position": [10,520],
    "size": [500,500],
},

像这种就是,三个不重叠的窗口。

cmd例子1 cmd例子2
cmd例子3

看来过于太复杂也不好玩了,估计json语法就是一大门槛呢

……不用自定义 我想到了!只需要弄1个退出程序的时候记录位置功能 打开的时候自动读取就OK!
这样灵活性强 用户操作起来也不会那么麻烦 但是不等于自定义就没用了 自定义位置功能仍然有用
可以优先自定义 然后不存在就读取那个临时记录配置

commented

其实读取用户拖动位置挺麻烦,设置位置却是顺便的。另外一个事情是,这个程序的设计是不会向硬盘写入任何数据(除了开机启动,与初始配置),因为支持了注释等之类的,目前技术上也是没法改写配置的。

不用去读取拖动位置呀……因为不是时时记录位置 只在退出的时候获取程序的位置做记录保存到软件目录下
另一个配置文件这样 主要是位置参数写起来好像对我们有难度

好吧你看下咋弄 写程序我不太懂 要么判断移动记录 要么判断关闭记录 实在不行就暂时先搁置着吧

commented

我得想想写到哪里去,刚刚我发现读取数据也是非常容易的!!

写到主程序.exe的那个目录?或者系统临时temp目录?这个我不懂 都行暂时没想到有啥后果
关于退出记录 不用去在意人为点叉叉按钮的 只要从本程序点了退出的按钮和关闭整个程序的 这2个事件发生
然后读取那些窗口位置做记录 这样你看有写起来压力不

commented

这个我倒不是这么想,我想投机取巧,在用户隐藏窗口的那一瞬间记录一下,这个值应该是准的。只是怎么记录,之后怎么读取,然后内部还有一系列的函数接口参数要改

newgame
为你点赞 妙啊 比我的好 因为那个动作操作最频繁 也最有依据 真聪明(哈哈是我太笨了)
加油~

commented

qq 20171214003958

有兴趣可以测试下最新版

写完发现意义不太大(读取配置部分完全用lambda表达式重写了,现在倒是增删配置容易得多了),也许还是定时计划任务和快捷键有意义一点儿。快捷键似乎有取巧的方法,直接做一个消息转发就好。计划任务有点想支持crontab的语法,但是似乎就必须引入正则库了,那样编译出来的文件大小估计会翻三四倍,摊手

lls zura
好的 我试试

哈哈 可以啦~真棒
一开始测试的时候就说为啥不写入缓存 原来要把enable_cache状态改成true启动
嘻嘻 会玩了 真好用!
default
我再多测试一会 因为旧的配置不能用 我重新编辑一下 要是有BUG我再来报告

commented

嗯 故意默认不启用缓存,因为内存消耗会略微多一点儿。我这里10多个配置,似乎初始2M,运行一段时间后0.1M。

其实我刻意保持了配置向后兼容,新选项都是可选的,我自己测试是下载下来,然后直接覆盖掉exe,加几行配置(一般就是最后那几个)。

大致会用了 好像是在点 隐藏全部 的时候记录的
修改json配置后cache好像会失效 (我就增加个分组显隐的 之前的chache就失效了) 【它会重新配置】

"left_click": [0,1,2,3], //就增加了个3这样会失效

然后那个命令行窗口置顶好像多呼出隐藏的时候也不会置顶(不过这个不要紧)

commented

cache失效用的时间戳,这是因为对配置做了何种修改没法判定,做的最坏打算,比较安全。

如果修改配置想使缓存不失效,打开缓存然后保存下,使它的时间在配置之后就可以绕过。

置顶我确实还没用过,也许可以开个小透明窗口当做开悬浮日志用

commented

好了 呼出置顶现在应该有效了,等会发布一个正式版

commented

dny_ci2v4aeb_e8

有兴趣继续测试支持快捷键的最新版,然后短期不扩展功能,只修修bug了。

ok
OK

嘿嘿~窗口置顶的问题好像解决了

但是那个点击和隐藏记录cache好像有点问题 如果已经记录了 然后修改或者删除文件后他就不记录了……
(关于人为操作 误删/重制)
比如我突然删除了cache文件 (程序这时候还启动着)在做任何操作他都不会记录 仅修改不删除他好像也不会在记录了
好像缺少文件存在和修改后 再做记录的判断
正常现在移动窗口位置[隐藏全部/左击2下]后重新开都会记录

关于重启程序后不会直接显示窗口的问题 我通过修改【"start_show": true,】解决了
但是重启窗口后 不是透明的 和大小不对 不会按照配置或者cache的设置显示...
333333
4444444
也就是说正常加了 启动:显示 参数后 透明度和窗口大小的显示会失效(隐藏全部后再显示就正常了)
这个是小问题

还有我察觉到了修复了一个BUG 就是之前只有窗口大小 没有修改位置的时候 窗口不显示的问题(没毛病了)

全局热键很好用
这次更新我有好一会是懵逼的 对着配置看了半天也调了半天
虽然发现过去的配置很方便可以直接用 但是还是手动去调了一下
发现了自己调节配置可能出现的 小毛病 错误 比如提示Load configure failed!
这个这个错误就是添加新程序的时候前后少了 { } 括号造成的
232323
还有管理员方式运行 需要先提权 不然会提示UIDP Error错误
4444444444445555
Could not AssignProcessToObject,You need to kill the process by TaskManager
提权失败的时候也会引发Load configure failed!错误 这个错误是因为记录cache失败了导致的
555555555
这个记录失败的错误就是我上面说的窗口不见的BUG 导致这个错误的原因有2个可能性 目前已知:
修改配置后没有清理cache缓存 或 提权失败后重启运行(这个时候记录产生重制记录失败了导致的)

这些应该都不算BUG! 都是可能引发的问题 如果配置是对的cache文件是对的(不对就删除重来)
基本都可以用
主要还是我上面那层楼说的问题 程序还在的时候[删除/修改]不记录 这样遇到错误的时候要重来
(最后说下 热键暂时没问题……我想应该也不会遇到啥问题 因为说明里面说的很清楚了)
...唯一可能出的问题就是第一次用的时候要记录好再用热键……不然全局关闭+启动 还是打开时候的样子

commented

哇! 居然发现这么多!而且好多情况确实都不在我之前考虑范围!

从你的cache截图来看似乎没有注意到如下几个默认选项

"disable_cache_position": false,
"disable_cache_size": false,
"disable_cache_enabled": true,
"disable_cache_show": true,

默认情况不会缓存启用禁用状态,显示隐藏状态。

重启子程序配置不生效,以及刚刚启动CommandTrayHost的时候"start_show": true 样式(位置透明度)不准的问题。是目前一个技术上的问题,刚刚启动程序的时候,程序实际上还没有创建窗口,获取不到句柄,所以没法修改位置透明度等信息,而且也不知道要等多久才会创建窗口。但是隐藏再显示一下应该就好了。

居然会手动删除cache文件!这个情况确实我没想过!现在启动的时候发现配置修改了,会弹窗询问是否保留旧缓存。 似乎应该发现被删除了也提示下。

缓存时机,以及运行中修改配置确实还有较大的优化空间。

也许可以把全局热键配置加到菜单文字后面

管理员运行我再看看。

配置出错就是json语法错误的意思,一般就是括号不配对,缺少逗号,或者字符串引号不配对。

VS Code或者Sublime应该会有红色警告提示出错地方。当然它们会把最后多的那个也算错误。 比如这个[1, 2, 3, ],严格json是不允许最后多的这个逗号的,语法着色可能也会提示黄色警告,但是CommandTrayHost配置里面是允许的。

另外,不知道你注意到默认配置里面的Alt+Ctrl+Win+ 以及 Alt+Ctrl+Win+Alt+Ctrl+Win+T没有,可以试着对记事本 或者其他程序试试,可以改大部分窗口(当前激活的窗口)的透明度。

commented

另外对于配置有一个简便的方法修改就是在不需要的配置前加//注释掉就好了,多行的也是同理。

比如这样

//"require_admin": false, // 是否CommandTrayHost要对自身提权
//"icon": "E:\\icons\\Mahm0udwally-All-Flat-Computer.ico", // 自定义托盘图标路径,空为默认内置 256x256
//"icon_size": 256, // 256 32 16
/*"left_click": [
        0,
        1
    ], */ // 左键单击显示/隐藏程序 configs序号,从0开始. 空数组或者注释掉,则显示CommandTrayHost本体
commented

qq 20171215215750

推荐日常使用今天的最新版本,昨天的有几处严重逻辑错误。现在那个"start_show": true透明度不生效的问题还没解决。 此外可以看看还有没有啥严重的bug

刚刚发现了一个BUG……就是程序不存在的时候 显隐 cache他会记录不存在的程序为0,0,0,0
454545
这样下次再打开的时候加载了这个配置 程序窗口为不可见了……
ddns更新完我就关掉了 然后他也在我的左击[显示隐藏]分组里……不存在了仍然被记录下来

嘿嘿这个也搬运开 方便更新的时候给别人看 到这里 #7

default
不知道昨天修复了啥……好像那个管理员的要先提权没啥问题 提权后发现管理员运行按钮不见了
今天直接测试那个管理员运行 没提权的情况下还是会报个错误 但是运行起来了!
33333333

之前有个问题忘记问了……
"repeat_mod_hotkey": false, //这个是啥用呀?重制mod热键?没读懂
"enable_hotkey": true, //开启热键为真?

“其实关于程序重启显示的问题” 我还是有一点疑问
默认对程序配置"start_show": false, // 是否以显示(而不是隐藏)的方式启动子程序
这个我没有设置的情况下 好像cache设置了"disable_cache_show": false, // 禁止缓存显示隐藏状态
也不会被记录 主要的问题点是 我想重启显示他
但是开机运行或重启CommandTrayHost窗口都是隐藏的
(还有我在想这些问题要不要在开个issues)【嘿嘿不好意思哈 这个我在开个问题好了】
这个问题搬运到 #6

commented

汗,这都怪我没有在我常用配置加上热键,因为我有一个用了一年多的auohotkey开机启动,一时换不过来。

  • UIPI错误
    那个UIPI错误是期望的,因为现在虽然运行起来了,但是关闭CommandTrayHost,那个管理员没法关闭,也就是不受控制但是运行起来了。以前可能是隐藏方式启动的,那样你可能根本没发现它在后台运行,所以我弹窗提示用任务管理器关掉,现在改成了始终用显示的方式启动,那样用户可以点叉叉关掉。这个弹窗我可以不显示,但是我还是觉得这种情况显示一下比较好。你怎么认为?

  • 热键选项

"repeat_mod_hotkey": false, //这是我发现注册系统热键时有个选项,大约是对长按只算作一次还是算作多次,我还真没测试过这个选项的意义。false表示长按只算一次。true的长按表示多次。
"enable_hotkey": true, //开启热键为真?

热键和缓存,目前192都是默认开启,即使没有 "enable_hotkey": true,只要有其他对应选项都是开启的。如果enable_**:false就是不要用这项功能的意思。

"enable_groups": true,
"enable_hotkey": true,
"enable_cache":  true,

这三个enable,字面意思就是启用分组菜单,启用热键,启用缓存。后面的true就是启用,但是有些默认是true,没有这行也是启用。要禁用就改成false。

只需要改成false,就不会校验配置的合法性,当然也不会执行相应操作。

commented

提权后不显示以管理员运行时期望的行为,因为一切都是管理员运行的了

额 如果在没提权的情况下 管理员运行 不受控制的话 那就先提示提权吧 提权后都是管理员运行
就改成原来那样没提权不运行管理员模式

commented

和原来不同的了么?原来是什么行为?从我昨天改bug时发现,原来实际上只要你运行了 ,虽然表面上没有运行,实际上就在后台在跑,任务管理器可以看到,而且是隐藏的。

之所以给出这个选项,是有时用户会想管理员运行一个cmd窗口,但是其他程序都不需要管理员。所以虽然启动,但是得要用户自己关。

那个弹窗实际上是在程序已经被成功启动了,但是没有被托管的情况下弹出来的,也许现在不隐藏就不要弹窗了。托管后,不管用什么方法杀掉CommandTrayHost(或者自己出错异常退出),被托管的程序都会被操作系统无条件杀掉。

另外我从你的截图发现你用的Administrator用户,额,管理员运行这个行为似乎对你会有所不同?

commented

而且原来的是你管理员运行多少次就在后台偷偷运行了多少次,可能会有一大片。我就是这样发现的,十多个cmd.exe

好吧 我刚刚才发现 多点了几下管理员运行 提示错误后 好像是会不结束多了个cmd
我一般是正常启动 没开管理员 那就改成没提权不启动管理员吧 因为不受控制无法退出跟着结束
我发现提权好像会重启所有

commented

管理员启动你是不是不会弹出一个全屏的UAC窗口?

提权重启没办法,这是被托管的缘故。

全局的"require_admin": true,可以控制CommandTrayHost在自己一运行就提权(在启动其他之前就会提权)。如果你那里不弹出UAC,你可以改成true。

好的我试试最新版 我不弹UAC 但是安全软件会报告是否给与管理员权限

commented

既然是刚刚 那么用刚刚的那个 修正了一个单词拼写错误

33333333
嘿嘿 我在测试1.7-b207版本 好像一打开就会多次提示这个

commented

多次么?我倒是没遇到过多次弹出。先点否吧。我再看看

额 点否 就没了 就正常了 就一开始的时候

commented

可能是会有两处,因为某个函数开头被调用了两次,但是按理说弹窗会阻止程序向下运行,后面不会弹出来才对啊。

209与207相比就改了一个单词 start_show_silent start_show_slient 虽然这个默认选项都是true,差别不大

好像又发现了个BUG……
先把"disable_cache_show": false,// 禁止缓存显示隐藏状态
先设置false记录了显隐状态 然后设置成true不记录 他好像不会重制cache
然后就是设置成true也不会让cache不记录……就是这个设置失效了

newgame
是的呀
休息一下 明天 在弄吧 累了一天了吧

commented

不应该啊!是不是因为没有清空缓存。那个缓存valid会有干扰的

清空了 也重启了 手动操作的 小问题 不要紧 明天在弄吧
newgame
可能是因为现在cache是时时记录的一样

好啦 没问题啦
"disable_cache_show": true, // 禁止缓存显示隐藏状态
重启不会在记录了 但是好像重启单个窗口也不会记录当前状态重启了

commented

我知道问题原因了,你真是厉害。这段代码我看来好几遍都没发现,我知道问题了 你缺少了 "conform_cache_expire": true, 只有这样才能测出这个bug 马上发一个新版本

commented

虽然是一个bug,但是并不是你发现的这个。这个的原因还在调查中。我打印出来的disable_cache值确实不对,不受json文件控制,一直是false。

commented

一处的单词打错了 应该用disable_cache_show,打成了disable_cache_enable,所以导致这个选项无效

commented

最新版已修复 果然有人测试就是比较好

default
暂时没 问题啦 上个版本啥问题我都不知道啦

426-
很完美了 管理员启动好像也不会多一个cmd了

commented

上个版本就是如果缺项disable_cache选项的话,之后的全部会错位。就像上次快捷键错位一样。刚刚先修复的这个问题。

commented

目前可以一开始就启动有透明和位置样式的了 这是今天的一大改动。当然管理员启动的没权限,所以改不动样式。

commented

目前UIDP错误改成通知了,不弹窗了

o k k
很棒了现在 休息一下 我再看看还有啥问题不

commented

选 是清空会反复弹出的问题修复了,选 是 就会删除缓存,并禁用缓存。下次启动才会新建缓存。

default

再躺一会

commented

睡着了

..天气太冷了 我窝了一晚上 再睡会呗?

commented

话说我一度以为你的时区在西半球

commented

最后那两次更新是可以重启应用的时候也保持位置和透明度,以前的好像不能

commented

接下来个 每个配置支持每多少(30)分钟重启一次?

我也是这么想……