了解按键禁用挂钩功能

时间:2019-05-18 07:54:54

标签: c++ visual-c++ hook game-engine

我正在尝试禁用软件中的特定默认密钥,该密钥具有脚本扩展程序提供的代码。脚本扩展程序具有void函数,该函数要求特定于脚本扩展程序环境的单例(代码示例1)。为了尝试使用C ++,我尝试转发原始代码,方法是为我要修改的游戏尝试插入键(0x2D)(根据IDA和Ghidra,此键为0x70)(代码示例2)。该代码通过main.cpp内部的布尔查询加载功能(代码示例3)启用。

所有头文件均已正确实现,但代码不执行任何操作。该插件是.dll,我确实获得了一个跟踪日志,该.dll实际上已加载,但是该功能无法正常工作。另外,对我来说,调试跟踪的唯一方法是通过消息,因为我需要向上述游戏软件添加调试器,而我不能。

那么基本的主要问题是?如何正确解决所说的按键钩,以禁用插入键?而且由于我是该游戏特定的C ++的新手,所以我什至都不知道从哪里开始,因为这似乎不像将C ++用于Civilization V那样容易。

谢谢


example 1

void DIHookControl::SetKeyDisableState(UInt32 keycode, bool bDisable, UInt32 mask)
{
    if(!mask) mask = kDisable_All;  // default mask value

    if(keycode < InputMap::kMaxMacros)
    {
        KeyInfo * info = &m_keys[keycode];

        if(mask & kDisable_User)    info->userDisable = bDisable;
        if(mask & kDisable_Script)  info->scriptDisable = bDisable;
    }
}

example 2

DIHookControl::GetSingleton().SetKeyDisableState(0x70, true, 0);

example 3

bool Plugin_Load(const Interface* a_skse)
{
    _MESSAGE("[MESSAGE] Unbound Keys Mod loaded");

    //DIHookControl::SetKeyDisableState(UInt32 keycode, bool bDisable, UInt32 mask);

    DIHookControl::GetSingleton().SetKeyDisableState(0x70, true, 0);

    return true;
}

0 个答案:

没有答案