vb的一些技巧和心得

第一堂课

1、关于timer控件
timer控件是个好东西,不过看了坛子里的一些代码,发现大家使用上有些问题。
private sub timer1_ontimer()
'do something
end sub
通常大家都是这么做的,不过我来说一下我的经验,最好在ontimer的开始disable掉这个timer,然后作你的操作,最后再enable它,为什么这样呢?因为假如你在ontimer事件里面的操作耗费的时间比较长,超过了timer的interval,就容易出一些冲突,所以最好这样做:
private sub timer1_ontimer()
timer1.enable=false
'do something
timer1.enable=true
end sub
这是我以前做上位机通讯软件得来的血泪教训。

2、关于计时
比如像罡气、GF之类的计时辅助状态,需要在程序中开一个计时器来判断是否已经超时,我一般的做法是用gettickcount函数,该函数返回开机以来流逝的毫秒数。可以定义一个模块级公有变量,在你的循环或ontimer事件中作如下处理
public lngAttackTick as long
事件 or loop
  if gettickcount() - lngAttackTick > 30*60*1000 then
    '加攻击
    lngAttackTick = gettickcount()
  end if
end 事件 or loop

当然也可以用timer控件来实现
dim lngSec as long
lngSec=0
timer1.interval=1000 '一秒触发一次
private sub timer1_ontimer()
  timer1.enable=false
  lngSec=lngSec+1
  if lngSec>=30 then
    '使用辅助技能
  lngSec=0
  end if
  timer1.enable=true
end sub

vb的timer控件的问题还是很多的,容易受代码执行影响造成不准,且interval无法精确到毫秒级,不过我们用来做作小挂,还是够用了。

3、关于字符串操作
字符串能够从字节数组转换而来,比如
dim byteName(32) as byte
dim strName as string
strName=byteName
这是可以的,涉及到宽窄字符问题,可以使用strconv函数

mid函数从最早的qbasic时期就存在了,vb也将此函数作为内置函数,但是你们知道么?mid函数的效率也是很高的,看下列比较:
操作1:
dim i as long
dim str as string
str=""
for i=1 to 100000
  str=str & "a"
next

操作2:
dim i as long
dim str as string
str=space(100000)
for i=1 to 100000
  mid(str,i,1)="a"
next

以上2个操作的效率不可同日而语,如果字符串的长度非常非常长,更可以比较出效果来,这是我在以前开发一个彩票分析软件得来的经验。


4、关于指针
指针??你一定会说我看错了吧?vb有指针么?vb确实没有指针,不过善用api的copymemory函数和内置的varptr,strptr和objptr等函数,你能得到不会太差于c指针操作的效率。具体的我就不讲了,你们可以google一下一篇文章,名字大概是“vb的葵花宝典”之类的,很有用处。我简单举个例子吧:
dim a as long
dim b as long
a=10
copymemory byval varptr(b), byval varptr(a), 4
此条语句的意思是从变量a所指的地址开始,copy4个字节到变量b所指的地址,实际就是b=a,当然这是个简单的操作了,继续看下面的:
dim a(10) as byte
dim b(5) as byte
'do something to fill array a
copymemory byval varptr(b(0)), byval varptr(a(5)), 5
这是什么意思?是从a的第6个元素的所指的地址copy5个字节到b第一个元素所指的地址,明白了?

下面附上3个api的声明:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (pDst As Any, ByVal numbytes As Long)
Public Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" (pDst As Any, ByVal Length As Long, ByVal Fill As Byte)


5、关于跨进程通信
如果你的vb挂是挂了钩子在游戏线程上,或用了dll注入,需要传递信息怎么办?可以用内存映射文件,比较简单的就是发送wm_copydata消息了
wm_copydata消息可以跨进程传递数据,
private type copydatastruct '发送wm_copydata消息需要的结构
dwdata as long
cbdata as long
lpdata as long
end type
dim cds as copydatastruct
dim a(100) as byte '我要传递这个数组到另外一个进程
'do something to fill array a
cds.dwdata=0 '保留字段,没有用处,你可以传自己定义的命令什么的
cds.cbdata=100 '数组的长度
cds.lpdata=varptr(a(0)) 'lpdata是你要传递的数据指针,这里是个100元素的字节数组,所以我们要传得是数组首元素的地址
sendmessage(targetHWND, wm_copydata, 0, cds)
这就ok了。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值