辅助中的DLL通信的问题!
首先说一下我的DLL..DLL是通过远程插入的方式插入到游戏中.在DLL中我用消息钩子的方法来钩住发给游戏窗体的消息
代码:
fpd:=FindWindow(nil, 'WGdll.txt - 记事本');
GameTid:=GetWindowThreadProcessId(fpd,nil);
hHk :=SetWindowsHookExA(WH_GETMESSAGE,@HookProc,HInstance,GameTid);
消息回调处理.用的是论坛里的朋友给出的一个测试代码..
const
WM_mymgs= WM_USER+104;
function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
var
st:PMessage;
begin
st:=pmessage(LParam);
if st.WParam = WM_mymgs then
showmessage('ok!');
Result := CallNextHookEx(hHk,nCode,WParam,LParam);
end;
可以正常拦到自定义的信息....显示OK
但是比如说,我想把游戏中要用到的一些打怪的CALL或者其他的CALL都放到DLL中来.插入到游戏中..
然后通过辅助程序(EXE),发一个自定义的消息给游戏,DLL会拦下来自己运行..
经测试,选怪的CALL和普通攻击的CALL 都可以正常成功.但是有些CALL是带参数的.不知道高手们是怎么传到DLL的呢... 这个容易,不过我不懂D,只能看,不会写,我举个C的例子,希望对LZ有帮助。
我举一个走路的例子。
在EXE和DLL中都定义一个消息:#define WM_AUTOMOVE WM_USER+101
EXE中发送消息:
void CLoaderDlg::OnBtnMoveto()
{
UpdateData();
::SendMessage(m_hCHWnd,WM_AUTOMOVE,m_ItemX,m_ItemY);
}
DLL中的回调时这样写的:
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
try
{
if (nCode == HC_ACTION)
{
switch(((PCWPSTRUCT)lParam)->message)
{
case WM_AUTOMOVE:
OutToHookLog("移动到坐标: %d,%d",((PCWPSTRUCT)lParam)->wParam, ((PCWPSTRUCT)lParam)->lParam);
PGAME_ITEMPOS pstItemPos = new GAME_ITEMPOS;
RtlZeroMemory(pstItemPos, sizeof(GAME_ITEMPOS));
pstItemPos->x = (float)((PCWPSTRUCT)lParam)->wParam;
pstItemPos->y = (float)((PCWPSTRUCT)lParam)->lParam;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AutoPath, pstItemPos, 0, NULL);
break;
}
bStartHook = TRUE;
}
}
catch (...)
{
OutToHookLog("catch error...");
}
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}
这样就OK了,SendMessage本来就支持传递参数的嘛,嘿嘿。 SendMessag是要等到他运行成功才返回的
我现在用的是postMessage..
procedure TForm1.Button2Click(Sender: TObject);
var
Str:char;
GameTid:THandle;
begin
Str := 'o';
fpd:=FindWindow(nil,'WGdll.txt - 记事本');
GetWindowThreadProcessId(fpd,@GameTid);
Memo1.Lines.Add(IntToStr(GameTid) + '--' + inttostr(fpd) + '---' + str);
postmessage(fpd,WM_mymgs,Integer(PChar(str)),0);
end;
在DLL就是显示不出来发过来的字符.上面的代码应该是VC的吧 你的问题不是消息收不到,它们已经通了,你的问题的怎么传递参数。
所以,什么postmessage,sendMessage都无所谓了。
我不懂Delphi,我觉得你发消息这里没有问题的。
你看一下你的DLL代码吧,那个showmessage('ok!');能弹出来么?
然后调试下看看参数传递过去了没。
然后在说吧。
页:
[1]