vb的一些技巧和心得

2021-04-13 01:17:32 字數 2731 閱讀 1581

第一堂課

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個操作的效率不可同日而語,如果字串的長度非常非常長,更可以比較出效果來,這是我在以前開發乙個彩票分析軟體得來的經驗。

下面附上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了。

翻譯原版教材的一些技巧和心得

剛剛翻譯完box2d2.3.0版本的英文使用者指南,雖然原文只有70頁,並不是那種上百頁的 巨著 但是依然感覺收穫頗豐。在這裡也分享一下我個人總結出來的一些技巧和心得。我覺得翻譯原版教材之前,譯者應該更多的去了解教材裡面的技術細節,如果能夠完全理解教材所介紹的具體內容更是再好不過了。翻譯之前,最好通...

Visual C 一些開發心得與除錯技巧

自己平時收集的一些技巧與心得,這裡分享出來,普及一下知識。1.如何在release狀態下進行除錯 project setting projectsetting對話方塊,選擇release狀態。c c 標籤中的category選general,optimizations選disable debug d...

VB和VBA工程的一些限制

乙個工程最多可以包含32,000 個 識別符號 非保留字 它們包括 但不限於 窗體 控制項 模組 變數 常量 過程 函式和物件,但實際的識別符號數受可用記憶體的限制。vb和vba中的變數名不多於 255 個字元。窗體 控制項 模組和類名不多於 40 個字元。可被載入到窗體 類或標準模組的 總數限於 ...