无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 28581|回复: 154

[原创] 有了这款简易对话框组件,批处理不用再面向黑框了

  [复制链接]
发表于 2020-11-17 20:47:23 | 显示全部楼层 |阅读模式
本帖最后由 CodeHz 于 2020-11-18 22:40 编辑

基本上就是用了 TaskDialog 这个 API,用的是win7以上都有的 comctl32 库(大概pe不会精简这个吧)
使用场景:
制作PE的时候运行一些脚本,其中包含一些交互选项,但是不想运行一个复杂的vbs或者开发新的界面,这个东西就可以配上用场了
先上截图
标准信息框
condlg /wintitle 测试 /title 这是消息框 /icon Shield msgbox 这是内容
2020-11-17_18-40.png


自定义选项的信息框
可以从 %errorlevel% 中获得被选择的选项(数字可以看 https://docs.microsoft.com/en-us ... commctrl-taskdialog
condlg /wintitle 测试 /title 这是消息框 /icon Shield msgbox /button retry /button cancel 这是内容
2020-11-17_18-42.png


选择框
可以从 %errorlevel% 中获得被选择的选项(0 - 关闭, 1,2,3...就是具体的选项)
condlg /title 选择器 /wintitle 演示 /icon Information select /option "选项 A" /option "选项 B" 这是说明
2020-11-17_18-24.png


等待进度条
(同样可以指定显示的按钮,这里就不演示了)
condlg /wintitle 测试 /title 这是进度框 /icon Shield wait /timeout 5000 5秒后继续
2020-11-17_18-49.png


可以跨进程控制的进度指示框
这个就比较复杂了,看图吧
其中 pipe 必须为 windows nt 的路径格式,也就是 \\.\Pipe\xxxx (理论上可以跨机,但是我没测试,格式是 \\<ip or hostname>\Pipe\xxxx )
2020-11-17_20-06.png


具体参数解释
有如下通用参数 (子命令为rpc时无效)
  • /wintitle 设置窗口标题
  • /title 设置内容标题
  • /content 设置内容读取的文件,不指定就会使用末尾的参数
    (用于内容特别长的情况,通常都用最末尾的参数就够了)
  • /icon 设置图标,可选值 Warning|Error|Information|Shield

参数格式是
condlg <通用参数> <子命令> <子命令参数> <可选的的内容以参数形式提供,不可以/开头>
然后子命令上面大概都介绍过了,这里重点说说没介绍的marquee 和 rpc命令
marquee子命令
  • 必选参数 /pipe <命名管道路径> 用这个来控制对话框
  • 可选参数 /fps <数字> 刷新率,用于控制进度条滚动的速度
  • /cascade 在父进程退出后允许点击按钮以关闭对话框
  • /onexit <程序路径> (必须配合 cascade 使用)在父进程退出后调用指定程序,此时会禁用 cascade 允许的按钮(也就是又不能点击了)

rpc命令形式
condlg rpc <rpc参数> <rpc子命令> <rpc子命令参数>
rpc参数就是
  • /pipe - 用于指定连接的管道名字
  • /timeout - 用于指定连接的超时(不包括命令执行的超时。。)
  • /content - 用于指定文本参数,主要供 SetText 系列子命令使用

它也有几个子命令,分别是 Ping|Close|SetWinTitle|SetTitle|SetContent|SetProgress|SetRange|SetMarquee|WaitButton
  • Ping 用来测试对话框是否存在,可以看errorlevel是否等于0
  • Close 没啥好说的,就是关闭对应对话框
  • SetWinTitle SetTitle SetContent 就是设置各个文本属性,参数在末尾(也有类似的/content参数,不过得加在rpc后面)
  • SetProgress <0-65535> 设置进度位置,必须调用一次 SetRange 才会生效
  • SetRange <0-65535> <0-65535> 设置进度范围
  • SetMarquee 恢复为走马灯式的进度条
  • WaitButton 允许点击按钮,阻塞到按钮被点击为止

参数值和子命令解析规则:
大小写敏感,但是允许以 驼峰命名规则 和 下划线命名规则两种写法,
具体来说是 SetRange 和 set_range 合法,但是 Set_range 非法。

声明:
这是我业余时间做的一个小程序,因为复杂度还是有一点的,可能含有较多错误(甚至可能在目标设备上无法运行),希望大家使用之前先测试完备。
源码地址: https://github.com/codehz/condlg

下载压缩包(108kb)里会附带示例批处理,32位和64位
(另外还会附带一个 conapi.exe 用于隐藏/显示控制台,设置和获取标题,可以通过 help 子命令看帮助)
更新:
修复了select选项数量为2时会把关闭窗口也映射进去的问题。(同时增加了/cancellable选项指示是否显示关闭选项)
新特性,自动识别pipe路径,现在不以\开头时会自动使用 \\.\Pipe\ 作为前缀,感谢 @slore 的建议
另外在压缩包内增加了一个重要提示,就下面那条
更新 x2:增加了超链接解析,(只在content部分有效,语法是 <A HREF="XXXX">TEXT</A> 或者 [TEXT](XXXX) 两种格式)
2020-11-18_22-39.png

rel.7z (108.48 KB, 下载次数: 283)

点评

功能强大方便使用  发表于 2023-6-28 13:40

评分

参与人数 3无忧币 +15 收起 理由
absman1972 + 5 赞一个!
m68 + 5 赞一个!
freesoft00 + 5

查看全部评分

发表于 2020-11-17 20:54:27 | 显示全部楼层
功能强大方便使用
回复

使用道具 举报

发表于 2020-11-17 21:00:32 | 显示全部楼层
必须要顶
回复

使用道具 举报

发表于 2020-11-17 21:01:33 | 显示全部楼层
rpc,管道指定,太程序员了。
普通用户用,不需要知道这些,你可以定一个name或者id,内部自己拼接。参数是对应功能的,而不是根据代码原理来设定。

点评

目前改了一下,现在会自动加前缀  发表于 2020-11-17 22:47
其实是为了连接远程服务器用的(虽然有没有这个需求另说) 其实我这还有个情况,就是我最近做的windows容器项目可以重新映射NT内核对象的路径,刚好也能用这个来测试(  详情 回复 发表于 2020-11-17 21:04
回复

使用道具 举报

 楼主| 发表于 2020-11-17 21:04:40 | 显示全部楼层
slore 发表于 2020-11-17 21:01
rpc,管道指定,太程序员了。
普通用户用,不需要知道这些,你可以定一个name或者id,内部自己拼接。参数 ...

其实是为了连接远程服务器用的(虽然有没有这个需求另说)
其实我这还有个情况,就是我最近做的windows容器项目可以重新映射NT内核对象的路径,刚好也能用这个来测试(
回复

使用道具 举报

发表于 2020-11-17 21:09:00 | 显示全部楼层
好东西必须的顶
回复

使用道具 举报

发表于 2020-11-17 21:09:38 | 显示全部楼层
看上去非常不错,感谢楼主无私分享!
回复

使用道具 举报

发表于 2020-11-17 21:11:08 | 显示全部楼层
神马万一
回复

使用道具 举报

发表于 2020-11-17 21:11:19 | 显示全部楼层
支持
回复

使用道具 举报

发表于 2020-11-17 21:11:48 | 显示全部楼层
感谢提供
回复

使用道具 举报

发表于 2020-11-17 21:14:06 来自手机 | 显示全部楼层
来看看
回复

使用道具 举报

发表于 2020-11-17 21:18:29 来自手机 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 2020-11-17 21:45:54 | 显示全部楼层
这个是批处理可以实现的?那挺好
回复

使用道具 举报

发表于 2020-11-17 21:52:36 | 显示全部楼层
好东西,顶一下,谢谢了
回复

使用道具 举报

发表于 2020-11-17 21:52:53 | 显示全部楼层
等的就是这个,马上学习。
回复

使用道具 举报

发表于 2020-11-17 21:54:57 | 显示全部楼层
本帖最后由 wxgwxg 于 2020-11-17 21:57 编辑

说实话,我用utf8的bat文件就一直有乱码,用ansi没有问题。
回复

使用道具 举报

发表于 2020-11-17 22:00:53 | 显示全部楼层
必须要顶
回复

使用道具 举报

发表于 2020-11-17 22:22:37 | 显示全部楼层
看起来很不错,。谢谢分享
回复

使用道具 举报

发表于 2020-11-17 22:39:18 | 显示全部楼层
很强大~~API在WIN10上一致吧?

点评

当然是一致的  发表于 2020-11-17 22:46
回复

使用道具 举报

发表于 2020-11-17 22:50:58 | 显示全部楼层
看看。
回复

使用道具 举报

发表于 2020-11-17 23:05:55 | 显示全部楼层
直接跟名字简单多了。

不过放一个 “重要说明.txt”,为什么不直接把批处理给改成ANSI打包。。。
(你又不是分开发布的,批处理在一起啊。)

不改的话,progress不显示对话框,其他的是乱码。

Windows的批处理默认要ANSI。

如果非要用UTF8的话,得改下代码页。

@echo off
chcp 65001

点评

因为我本地的ANSI就是UTF-8  详情 回复 发表于 2020-11-17 23:16

评分

参与人数 1无忧币 +5 收起 理由
2011jifeiyun + 5 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-11-17 23:16:34 来自手机 | 显示全部楼层
slore 发表于 2020-11-17 23:05
直接跟名字简单多了。

不过放一个 “重要说明.txt”,为什么不直接把批处理给改成ANSI打包。。。

因为我本地的ANSI就是UTF-8
回复

使用道具 举报

发表于 2020-11-17 23:17:53 | 显示全部楼层
本帖最后由 双响炮 于 2020-11-17 23:50 编辑

持久对话框太符合我现在的需求了。但几个子命令不能同时使用吗?比如我想同时修改标题和内容。SetTitle起作用但SetContent不行

点评

你可以分开写的  详情 回复 发表于 2020-11-17 23:22
回复

使用道具 举报

 楼主| 发表于 2020-11-17 23:22:55 来自手机 | 显示全部楼层
双响炮 发表于 2020-11-17 23:17
持久对话框太符合我现在的需求了。但几个子命令不能同时使用吗?不如我想同时修改标题和内容。SetTitle起作 ...

你可以分开写的

点评

这样写对吗?就是分两步修改标题和内容?  详情 回复 发表于 2020-11-18 00:03
回复

使用道具 举报

发表于 2020-11-17 23:48:03 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

发表于 2020-11-17 23:58:30 | 显示全部楼层
告别黑框?!
回复

使用道具 举报

发表于 2020-11-18 00:03:50 | 显示全部楼层
本帖最后由 双响炮 于 2020-11-18 00:12 编辑
CodeHz 发表于 2020-11-17 23:22
你可以分开写的

这样写对吗?就是分两步修改标题和内容?
  1. @echo offre
  2. conapi title /value 设置标题
  3. conapi show /mode hide
  4. start /b condlg /title 友情提示! wintitle 一键恢复 /icon Information marquee /pipe snai9 /cascade 请不要关闭对话框 进度到100%%后会自动重启
  5. snapshot.exe
  6. condlg rpc /pipe snai9 set_title 恭喜!
  7. condlg rpc /pipe snai9 set_content 恢复成功,2秒后重启
  8. timeout 2
  9. condlg rpc /pipe snai9 close
复制代码



点评

对是对,不过为啥不直接关闭然后开一个新的wait对话框呢。。 反正都是最后一步了  详情 回复 发表于 2020-11-18 00:49
回复

使用道具 举报

发表于 2020-11-18 00:14:43 | 显示全部楼层
之前有用过类似的这些命令行小工具,只是贪新鲜,后来不了了之!
回复

使用道具 举报

 楼主| 发表于 2020-11-18 00:49:37 来自手机 | 显示全部楼层
双响炮 发表于 2020-11-18 00:03
这样写对吗?就是分两步修改标题和内容?

对是对,不过为啥不直接关闭然后开一个新的wait对话框呢。。 反正都是最后一步了

点评

正自个儿闷着瞎琢磨要把rpc和wait放在一起用了,就想最后2秒的进度条,怎么也不行,你这真是一语惊醒梦中人呀!  详情 回复 发表于 2020-11-18 01:01
回复

使用道具 举报

发表于 2020-11-18 01:01:07 | 显示全部楼层
CodeHz 发表于 2020-11-18 00:49
对是对,不过为啥不直接关闭然后开一个新的wait对话框呢。。 反正都是最后一步了

正自个儿闷着瞎琢磨要把rpc和wait放在一起用呢,就想最后2秒的进度条,怎么也不行,你这真是一语惊醒梦中人呀!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-29 20:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表