免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:65.第二阶段x64游戏实战-替换游戏lua打印可接任务
首先新加一个按钮和输入框
然后这个输入框的id是IDC_EDIT8,一会要用它
然后双击下图红框按钮,让它创建按钮点击时执行的函数
然后是抓取的打开任务窗口的lua代码
MainMenuBar_Mission_Clicked(); // 打开任务窗口
setmetatable(_G, {__index = QuestLog_Env});// setmetatable是lua的函数用来,给_G全局表的__index设置QuestLog_Env
QuestLog_OnEvent("TOGLE_MISSION");// 切换事件,比如隐藏或显示某个东西
QuestLog_ListBox_SelectChanged();// 切换当前任务窗口
QuestLog_UpdateMissionOutline();// 切换可接任务窗口
然后就开始写代码了,首先是获取任务的lua代码
function MissionOutlinetext()
setmetatable(_G, {__index = QuestLog_Env});
QuestLog_UpdateMissionOutline();
local str = ""
for i=1,200 do
local num = GetMissionOutlineNum(i)
if(num > 0)then
for bbb = 1,num do
-- a:任务等级(该任务对应的推荐等级)。
-- b:最低等级限制(玩家需达到该等级才能接取任务)。
-- c:最高等级限制(超过该等级可能无法接取,或任务奖励衰减)。
-- d:NPC 名称(发布 / 接取该任务的 NPC 名字,字符串类型)。
-- e:NPC 位置(NPC 所在的坐标或区域描述,字符串类型)。
-- f:场景名称(任务发生的地图 / 场景名称,字符串类型)。
-- g:任务名称(该任务的显示名称,字符串类型)。
local a,b,c,d,e,f,g = GetMissionOutlineInfo(i, bbb)
str = str..g.."|"-- 拼接内容
end
end
end
if str == nil then
return "0"
else
return str
end
end
strr = MissionOutlinetext() -- 获取任务名给全局变量strr
使用:然后点击获取返回值就可以在DebuView中看到了
效果图:
c代码,如下图是获取返回值按钮点击时执行的函数
void MyDialog::OnBnClickedButton18()
{
CStringA CStrA;
m_DbgEdit.GetWindowText(CStrA);
CStringA str;
GetDlgItemText(IDC_EDIT8, str);
;
if (!CStrA.IsEmpty())
{
/**
CStrA是lua代码
str取lua变量
*/
msg_getstring(CStrA.GetBuffer(), str.GetBuffer());
//msg_dostring(CStrA.GetBuffer());
CStrA.ReleaseBuffer();
}
}
msg_getstring函数,也就是把lua代码和返回值拼接成MyStruct结构
struct MyStruct
{
char* CStrA;
char* Creturn;
};
string msg_getstring(const char* str_arg, char* _Format, ...)//获取字符串
{
string str;
try
{
char getstringBuf[2048] = { 0 };//用于存放getstring的字符串缓冲区
va_list list;
va_start(list, _Format);
vsprintf(getstringBuf, _Format, list);
va_end(list);
//dbgPrint(getstringBuf);
MyStruct getstring = { 0 };
getstring.CStrA = (char*)str_arg;// lua代码
getstring.Creturn = (char*)getstringBuf;// 返回值
// 发送给0x1003消息
::SendMessageA(m_Hwnd, g_MyID, 0x1003, (LPARAM)&getstring);
// 获取返回值
str = getstring.CStrA;
LogA(" getstring.CStrA==%s", str);
}
catch (...)
{
}
return str;
}
然后是0x1003消息
MyStruct tmp = *(MyStruct*)lpArg->lParam;
LogA("tmp.Creturn=%s", tmp.Creturn);
LogA("tmp.CStrA=%s", tmp.CStrA);
pMsg->telua_getstring((char*)tmp.CStrA, (char*)tmp.Creturn);
然后是telua_getstring
bool CMessage::telua_getstring(const char* buf, const char* want_get_string)
{
__try {
// 执行lua代码
if (telua_dostring(buf))
{
/**
根据want_get_string的值获取全局变量
如果want_get_string的值是strr
就是获取lua叫strr的全局变量的值
获取之后压入栈顶
*/
if (telua_getglobal(want_get_string))
{
LogA("telua_getglobal");
//telua_tostring 获取栈顶的值给str
const char* str = telua_tostring(-1);
// 把str的值写到buf里(覆盖),也就是原本的代码
sprintf((char*)buf, str);
// 然后把栈顶的值删除,恢复原本的栈
telua_pop(1);
LogA("telua_pop%s", buf);
return true;
}
else
{
const char* str = "错误1";
sprintf((char*)buf, str);
LogA("%s telua_getglobal erro", __FUNCTION__);
return false;
}
}
else
{
const char* str = "错误2";
sprintf((char*)buf, str);
LogA("%s telua_dostring erro", __FUNCTION__);
return false;
}
}
__except (1) {
LogA(__FUNCTION__); return false;
}
}