📄 mythreads.pas
字号:
unit MyThreads;
interface
uses SysUtils,windows,Messages,Classes,StrUtils,ShareDat;
Function HexToInt(sHex:string):integer;
procedure CtrlDefLife;
procedure CtrlAutoSay;
procedure CtrlMouse;
implementation
Function HexToInt(sHex:string):integer;
var
i:integer;
dwRes:word;
bInt:byte;
begin
SHex:=StringOfchar('0',4-length(sHex))+sHex;(*不足4位十六进制,高位补零*)
dwRes:=0;
for i:=1 to 4 do
begin
case AnsiIndexStr(LowerCase(sHex[i]),['a','b','c','d','e','f']) of
0:bInt:=10;
1:bInt:=11;
2:bInt:=12;
3:bInt:=13;
4:bInt:=14;
5:bInt:=15;
else
bInt:=strToint(sHex[i])
end;//end case
asm
xor ax,ax
mov al,byte ptr[bInt]
SHL word ptr[dwRes],4
OR word ptr[dwRes],ax
end
end;//end for
result:=dwRes
end;
function ReadData(Address: DWORD; N: integer; var Buf): integer;
var ByteOfRead: DWORD;
begin
Result:=-1;
if ReadProcessMemory(PHandle, Pointer(Address), @Buf, N, ByteOfRead) then
Result:=ByteOfRead;
end;
function DefHpThread(P:Pointer):LongInt;stdcall;
var
HpBuf:Array [0..1] of byte;
HpStr:String;
CharHP:Integer;
begin
while WaitForSingleObject(HpThread, 500)=WAIT_TIMEOUT do
begin
ReadData(HpAddress, 2, HpBuf);
HpStr:=IntToHex(HpBuf[1],2)+IntToHex(HpBuf[0],2);
CharHp:=HexToInt(HpStr);
if (ChkHp) and (CharHP<=DefHp) then
begin
asm
push KeyHp
Call KeyFunAddr
end;
end;
end;
Result:=0;
end;
function DefMpThread(P:Pointer):LongInt;stdcall;
var
MpBuf:Array [0..1] of byte;
MpStr:String;
CharMP:Integer;
begin
while WaitForSingleObject(MpThread, 500)=WAIT_TIMEOUT do
begin
ReadData(MpAddress, 2, MpBuf);
MpStr:=IntToHex(MpBuf[1],2)+IntToHex(MpBuf[0],2);
CharMP:=HexToInt(MpStr);
if (ChkMp) and (CharMP<=DefMp) then
begin
asm
push KeyMp
Call KeyFunAddr
end;
end;
end;
Result:=0;
end;
function DefBackThread(P:Pointer):LongInt;stdcall;
var
MedBuf:Array [0..1] of byte;
MedStr:String;
MedNum:Integer;
begin
while WaitForSingleObject(MedThread, 500)=WAIT_TIMEOUT do
begin
ReadData(GameKeyFirstAddr+KeyMP*8+2,2,MedBuf);
MedStr:=IntToHex(MedBuf[1],2)+IntToHex(MedBuf[0],2);
MedNum:=HexToInt(MedStr);
UseBlue:=MedNUm;
ReadData(GameKeyFirstAddr+KeyHP*8+2,2,MedBuf);
MedStr:=IntToHex(MedBuf[1],2)+IntToHex(MedBuf[0],2);
MedNum:=HexToInt(MedStr);
Usered:=MedNUm;
if (ChkMedBack) and (MedNum=0) then
begin
asm
push KeyBack
Call KeyFunAddr
end;
end;
end;
Result:=0;
end;
function AutoSkillThread(P:Pointer):LongInt;stdcall;
begin
while WaitForSingleObject(KeyThread, DefSkillTime)=WAIT_TIMEOUT do
begin
if ChkSkill then
begin
asm
push KeySkill
Call KeyFunAddr
end;
end;
end;
Result:=0;
end;
function AutoMouseThread(P:Pointer):LongInt;stdcall;
begin
while WaitForSingleObject(MouseThread, DefMouseTime)=WAIT_TIMEOUT do
begin
if MouseType=0 then begin
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end else if MouseType=1 then begin
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
end;
Result:=0;
end;
function AutoSayThread(P:Pointer):LongInt;stdcall;
var i:Integer;
begin
while True do begin
if Length(SayText1) > 0 then begin
for i:= 0 to Length(SayText1) do
begin
PostMessage(DllData^.GameHwnd, WM_CHAR, Ord(SayText1[i]), 0);
end;
PostMessage(DllData^.GameHwnd, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(DllData^.GameHwnd, WM_KEYUP, VK_RETURN, 0);
end;
Sleep(DefSayTime);
if Length(SayText2) > 0 then begin
for i:= 0 to Length(SayText2) do
begin
PostMessage(DllData^.GameHwnd, WM_CHAR, Ord(SayText2[i]), 0);
end;
PostMessage(DllData^.GameHwnd, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(DllData^.GameHwnd, WM_KEYUP, VK_RETURN, 0);
end;
Sleep(DefSayTime);
if Length(SayText3) > 0 then begin
for i:= 0 to Length(SayText3) do
begin
PostMessage(DllData^.GameHwnd, WM_CHAR,Ord(SayText3[i]), 0);
end;
PostMessage(DllData^.GameHwnd, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(DllData^.GameHwnd, WM_KEYUP, VK_RETURN, 0);
end;
Sleep(DefSayTime);
if Length(SayText4) > 0 then begin
for i:= 0 to Length(SayText4) do
begin
PostMessage(DllData^.GameHwnd, WM_CHAR,Ord(SayText4[i]), 0);
end;
PostMessage(DllData^.GameHwnd, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(DllData^.GameHwnd, WM_KEYUP, VK_RETURN, 0);
end;
Sleep(DefSayTime);
end;
Result:=0;
end;
function AutoSayOneThread(P:Pointer):LongInt;stdcall;
var i:Integer;
TempSay:String;
begin
while WaitForSingleObject(SayThread, DefSayTime)=WAIT_TIMEOUT do
begin
case SayNum of
1:TempSay:=SayText1;
2:TempSay:=SayText2;
3:TempSay:=SayText3;
4:TempSay:=SayText4;
end;
if Length(TempSay) > 0 then begin
for i:= 0 to Length(TempSay) do
begin
PostMessage(DllData^.GameHwnd, WM_CHAR, Ord(TempSay[i]), 0);
end;
PostMessage(DllData^.GameHwnd, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(DllData^.GameHwnd, WM_KEYUP, VK_RETURN, 0);
end;
end;
Result:=0;
end;
procedure CtrlDefLife;
var TId,Tid2,Tid3,Tid4:DWORD;
begin
KeyFunAddr:=Pointer($0050C0B0);
if HpThread=0 then
begin
HpThread:=CreateThread(nil,0,@DefHpThread,nil,0,TId);
end else begin
TerminateThread(HpThread,0);
HpThread:=0;
end;
if MpThread=0 then
begin
MpThread:=CreateThread(nil,0,@DefMpThread,nil,0,Tid2);
end else begin
TerminateThread(MpThread,0);
MpThread:=0;
end;
if MedThread=0 then
begin
MedThread:=CreateThread(nil,0,@DefBackThread,nil,0,Tid3);
end else begin
TerminateThread(MedThread,0);
MedThread:=0;
end;
if KeyThread=0 then
begin
KeyThread:=CreateThread(nil,0,@AutoSkillThread,nil,0,Tid4);
end else begin
TerminateThread(KeyThread,0);
KeyThread:=0;
end;
end;
procedure CtrlAutoSay;
var TId:DWORD;
begin
if SayThread=0 then
if SayType=0 then
SayThread:=CreateThread(nil,0,@AutoSayOneThread,nil,0,TId)
else
SayThread:=CreateThread(nil,0,@AutoSayThread,nil,0,TId)
else begin
TerminateThread(SayThread,0);
SayThread:=0;
end;
end;
procedure CtrlMouse;
var TId:DWORD;
begin
if MouseThread=0 then
MouseThread:=CreateThread(nil,0,@AutoMouseThread,nil,0,TId)
else begin
TerminateThread(MouseThread,0);
MouseThread:=0;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -