无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: CodeHz
打印 上一主题 下一主题

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

  [复制链接]
跳转到指定楼层
1#
发表于 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 这是内容



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



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



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



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



具体参数解释
有如下通用参数 (子命令为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) 两种格式)


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




评分

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

查看全部评分

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

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

使用道具 举报

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

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

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

使用道具 举报

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

你可以分开写的
回复

使用道具 举报

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

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

使用道具 举报

6#
 楼主| 发表于 2020-11-18 01:42:05 来自手机 | 显示全部楼层
双响炮 发表于 2020-11-18 01:15
这样写果然可以了,问题又来了,wait能不能不显示确定按钮?或者有没有取消按钮?万一不想重启还能返回。

可以,和msgbox一样可以用/button指定按钮,然后用%errorlevel%判断,具体数值你可以先试验一下
回复

使用道具 举报

7#
 楼主| 发表于 2020-11-18 08:05:17 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-18 07:20
这个程序很有趣啊!批处理调用居然可以弹出个对话框!windows默认都是ansi编码的啊,为什么要用utf-8编码作 ...

Win10有个使用utf8选项啊。。。
回复

使用道具 举报

8#
 楼主| 发表于 2020-11-18 22:57:51 来自手机 | 显示全部楼层
双响炮 发表于 2020-11-18 21:23
奇怪呀,实际测试居然snapshot.exe的自动恢复界面出不来,把修改成仅仅打开snapshot.exe这个软件却又是可 ...

理论上不会影响的,我比较怀疑是哪里打错了(要不你把那个show的那一行用rem吃掉测试下报错信息
回复

使用道具 举报

9#
 楼主| 发表于 2020-11-19 15:38:05 | 显示全部楼层
本帖最后由 CodeHz 于 2020-11-19 15:41 编辑
liuzhaoyzz 发表于 2020-11-19 15:25
在xp的虚拟机里面试了下,似乎不能运行?utf-8双击没有反应,然后我改成了ansi编码,去掉了chcp 65 ...

显然不只是静态编译的问题,comctl32 6.0 这东西反向移植成本很高,xp用的低版本没有TaskDialog)而且这个错误明显是因为你在32位系统下跑64位的版本
回复

使用道具 举报

10#
 楼主| 发表于 2020-11-19 18:26:17 | 显示全部楼层
本帖最后由 CodeHz 于 2020-11-19 18:31 编辑
plusv 发表于 2020-11-19 17:51
1.
回报一个问题,
防毒软件对 ZIG 语言非常敏感.

https://www.virustotal.com/gui/f ... 87f16d53b/detection
很显然,非常敏感是站不住脚的。。。72款杀毒只有两个误报,而且根据我测试,好像tm和我加上的CodeHz标签有关系,真就关键字检测呗。。。。
问题2 并不想解决,一来没有测试环境,二来很明显没有收益(我现在所有的设备都没法原生跑win7,更别说xp了(

点评

1.说个有点搞笑的现实问题,viruscan这样的检测没有太大用处,为什么?因为根本不用检测大家都知道没有病毒,那么还检测个啥劲儿呢?国内360安全卫士之类的装机量很高(我自己不用任何杀软,只为重现别人的环  详情 回复 发表于 2020-11-19 22:52
回复

使用道具 举报

11#
 楼主| 发表于 2020-11-19 20:43:01 | 显示全部楼层
双响炮 发表于 2020-11-19 20:23
估计这句有点问题,系统盘和PE启动后的X盘都有explorer.exe,变量%sd%的值先是C,后来又变成X了,我对批 ...

hmm,你可以在循环里去掉X盘的(PE是不是都用这个啊(

点评

我也是这样想,如果实在搞不好就去掉X,但也有PE不是X的,或者把PE的explorer.exe删除,但别人的PE就不能用了,所以还是想多学点批处理的知识,应当能解决,只是在网上看了下问这个的不多  详情 回复 发表于 2020-11-19 21:01
回复

使用道具 举报

12#
 楼主| 发表于 2020-11-21 14:12:07 | 显示全部楼层
双响炮 发表于 2020-11-21 13:55
这些个参数只有几个会用,其它几个能说说怎么用吗?特别是shownoactivate和showna的区别,再就是showminim ...

(具体来说就是微软提供了这些选项我就全列出来了。。。它自己的文档就没说清楚,选项之间也没有正交性...
但是大概
ShowNoActivate相比ShowNa是最小化,Na则是只显示不激活,原来最小化还是最小化
restore对应的是minimize和maximize,就是恢复先前最大化或者最小化的窗口
showdefault则是使用程序启动时默认的显示方式

https://docs.microsoft.com/en-us ... -winuser-showwindow

UAC提权不能在当前进程里完成,必须至少开一个新进程(指正常的,不进内核暴力改的方法),安装程序可以点按钮提权的原理是弄了个后台程序,然后把进度反映过来而已,不过PE的时候应该UAC都是关闭的吧。

点评

似乎有点明白了。PE那个已成功了,这里表示感谢。因为我还有个安装PE的批处理,在WIN7里蛮好,但在WIN10里提权还要重启才能行,故而有此一问,不过ShellExecuteEx应该可以吧?  详情 回复 发表于 2020-11-21 15:19
回复

使用道具 举报

13#
 楼主| 发表于 2020-11-21 15:30:17 | 显示全部楼层
双响炮 发表于 2020-11-21 15:19
似乎有点明白了。PE那个已成功了,这里表示感谢。因为我还有个安装PE的批处理,在WIN7里蛮好,但在WIN10 ...

win7也得开个新的,可能你只是关闭了uac
win10关了uac也需要手动提权(只是没框)所以用shellexecuteex应该可以
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-6 08:33

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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