rexdf / CommandTrayHost

A command line program monitor systray for Windows
MIT License
396 stars 40 forks source link

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

Closed lirener closed 6 years ago

lirener commented 6 years ago

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

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

rexdf commented 6 years ago

是有在考虑热键功能

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

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

哈哈

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

lirener commented 6 years ago

default

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

default 不太懂

rexdf commented 6 years ago
{
    "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语法就是一大门槛呢

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

qq 20171214003958

有兴趣可以测试下最新版

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

lirener commented 6 years ago

lls zura 好的 我试试

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

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

lirener commented 6 years ago

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

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

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

rexdf commented 6 years ago

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

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

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

rexdf commented 6 years ago

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

rexdf commented 6 years ago

dny_ci2v4aeb_e8

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

lirener commented 6 years ago

ok OK

lirener commented 6 years ago

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

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

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

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

lirener commented 6 years ago

全局热键很好用 这次更新我有好一会是懵逼的 对着配置看了半天也调了半天 虽然发现过去的配置很方便可以直接用 但是还是手动去调了一下 发现了自己调节配置可能出现的 小毛病 错误 比如提示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文件是对的(不对就删除重来) 基本都可以用 主要还是我上面那层楼说的问题 程序还在的时候[删除/修改]不记录 这样遇到错误的时候要重来 (最后说下 热键暂时没问题……我想应该也不会遇到啥问题 因为说明里面说的很清楚了) ...唯一可能出的问题就是第一次用的时候要记录好再用热键……不然全局关闭+启动 还是打开时候的样子

rexdf commented 6 years ago

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

从你的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没有,可以试着对记事本 或者其他程序试试,可以改大部分窗口(当前激活的窗口)的透明度。

rexdf commented 6 years ago

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

比如这样

//"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本体
rexdf commented 6 years ago

qq 20171215215750

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

lirener commented 6 years ago

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

嘿嘿这个也搬运开 方便更新的时候给别人看 到这里 https://github.com/rexdf/CommandTrayHost/issues/7

lirener commented 6 years ago

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

lirener commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

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

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

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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

rexdf commented 6 years ago

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

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

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

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

rexdf commented 6 years ago

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

lirener commented 6 years ago

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