dll注入,处理多线程

前提:用SetWindowsHookEx注入到游戏进程。SetWindowsHookEx的第2个参数为回调函数内容是按HOME呼出dll里面封装的Form.SetWind... 前提:
用SetWindowsHookEx注入到游戏进程。SetWindowsHookEx的第2个参数为回调函数 内容是按HOME呼出dll里面封装的Form.SetWindowsHookEx最后一个参数先用FindWindow获取游戏标题 然后GetWindowThreadProcessId获取该标题的id. Hook Mutex实现游戏多开。
问题:
开第一个游戏的话 按Home 可以呼出 但是如果你再开第2个游戏按Home就呼不出了。
请问该如何处理多线程 让程序只要开一个就可以注入多个游戏里?
大致代码:
var
keyhhk: HHOOK ;
Function keyproc(icode,wp,lp:integer):DWORD;stdcall; //键盘HOOK回调函数
begin
if (icode=HC_ACTION) then
begin
if (wp=VK_HOME)and ((1 shl 31)and lp=0) then
begin
if form1=nil then Form1:=Tform1.Create(nil);
form1.Visible:=not form1.Visible;
end;
end;
keyProc:=CallNextHookEx(keyhhk,icode,wp,lp);
end;
Function installKeyProc():boolean;stdcall;
var
h:HWND;
GameTid:THandle;
begin
Result:=false;
h:=FindWindow(nil,'武林外传11');
if h=0 then begin Messagebox(0,'未找到游戏','error',0);exit; end;
GameTid:=GetWindowThreadProcessId(h);
keyhhk:=SetWindowsHookEx(WH_KEYBOARD,@Keyproc,GetModuleHandle('HookDll.dll'),GameTid);
if keyhhk>0 then Result:=true;
end;
展开
 我来答
573837397
2010-05-11 · TA获得超过414个赞
知道答主
回答量:64
采纳率:0%
帮助的人:0
展开全部
function show:integer;stdcall; //声明函数
external 'sos.dll';

procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD);
var
hProcess_N: THandle;
ThreadAdd, ParamAdd: Pointer;
hThread: THandle;
ThreadID: DWORD;
lpNumberOfBytes:DWORD;
begin
GetWindowThreadProcessId(InHWND, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
WriteProcessMemory(hProcess_N, ThreadAdd, Func, 4096, lpNumberOfBytes);
ParamAdd := VirtualAllocEx(hProcess_N, nil, ParamSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes);
hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes);
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess_N, ThreadAdd, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess_N, ParamAdd, ParamSize, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess_N);
end;
上面的注入函数
procedure TForm1.Button2Click(Sender: TObject);
var
inhwnd:Hwnd;
ThreadID: DWORD;
hProcess_N: THandle;
begin
inhwnd:= FindWindow(nil,'shadow');
GetWindowThreadProcessId(InHWND, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
injectfunc(InHWND,@show,nil,0);

end;
这个是调用函数,请大大门看看. injectfunc(InHWND,@show,nil,0);这个句。我第3个和第4个参数不太明白是什么意思.因为我自己写个EXE推测市的时候,那个注入函数并不需要传参的,哪位有这方面的例子最好拿出来了.谢谢
在打包生成exe的时候,native executable builder,在第三步,选择数据库,在选择 include required classes and known resource这一项。在后面的选项中手动指向你的主类。试一下。原来我也遇到过这样的问题,按照上面的设置后可以正常使用了。

希望对你有点帮助!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
guizhoutiger
2010-05-13 · TA获得超过146个赞
知道答主
回答量:110
采纳率:0%
帮助的人:59.5万
展开全部
太多的代码,没去看呀!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式