请各位高手帮忙,新人求问,关于录制回放钩子

我参考文献写了以下代码,设置动态链接库再用对话框嗲用,但是在vs上调试和生成程序都没有错误,但是对话框按钮按了之后总是没有反应,请各位帮忙

CTypedPtrList EventMsgList;
//全局的链表
#pragma data_seg ("mydata")
HHOOK hHook; //全局的钩子句柄
#pragma data_seg ( )

         //以下为WH_JOURNALRECORD 钩子函数的实现
         //注意它必须是全局函数。

LRESULT WINAPI JournalRecordProc(
int nCode, // 钩子代码
WPARAM wParam, // 本参数未定义
LPARAM lParam) /* 指向包含被处理
的消息的EVENTMSG 结构*/
{
//如果nCode<0 则结束本钩子过程,
//将控制权转交给下一个钩子。
if (nCode < 0)
return CallNextHookEx(NULL, nCode,
wParam, lParam);
//指针类型转换
EVENTMSG pmsg = (EVENTMSG *)lParam;
EVENTMSG
pEventMsg = new EVENTMSG;
switch (nCode)
{
// HC_ACTION 表示参数lParam 指向一个EVENTMSG 结构, 它包含刚被处理的消息。
case HC_ACTION:

    //复制消息: 使用内存块拷贝法
    memcpy(pEventMsg, pmsg, sizeof(EVENTMSG));
    //将复制后的消息添加到链表中,
    //已备回放时使用。
    EventMsgList.AddTail(pEventMsg);
    break;
case HC_SYSMODALOFF: //模态对话框被关闭
    break;
case HC_SYSMODALON: //模态对话框显示
    break;
}

}

LRESULT WINAPI JournalPlaybackProc(
int nCode, // 钩子代码
WPARAM wParam, // 本参数未定义
LPARAM lParam) /* 指向包含被处理的消息的
EVENTMSG 结构*/
{
//静态变量, 用来指示链表中元素的位置索引
static signed i=0;
// bFlag 静态变量, 用来标志是否为第1 次进入HC_GETNEXT 分支
static BOOL bFlag = TRUE;
EVENTMSG *pMsg;
//链表的当前元素位置变量
POSITION pos;
//用来记录前后两个消息发生的时刻, 以便计算前后两条消息的时间间隔
DWORD PreTime, NowTime;

switch (nCode)
{
case HC_SKIP:
    //设置此标志的理由, 见说明(2) 和(5)
    bFlag = TRUE;
    //向后移动位置索引, 以备检索链表中的下一条消息
    i++;
    break;
case HC_GETNEXT:
    /*不要回放最后两个消息, 因为这两个消息为鼠标
    左键单击“停止录制”按钮的消息。而在回放时, 没有必要
    再次单击此按钮。Q*/
    if (i>EventMsgList.GetCount()-3)
    {
        //使下标计算器重新回到0, 以备再次重新录制。
        i = 0;
        //解除钩子(释放Hook)
        UnhookWindowsHookEx(hHook);
        AfxMessageBox(L"消息回放完毕!");
    }
    //在链表中检索第i 个消息
    pos = EventMsgList.FindIndex(i);
    pMsg = EventMsgList.GetAt(pos);
    //按内存块复制方法, 将第i 个消息复制到lParam 所指向的内存块中
    memcpy((LPEVENTMSG)lParam, pMsg,
        sizeof(EVENTMSG));
    //以下判断是为了防止当i = 0 时, i - 1 会发生下标越界的情况
    if ((i) != 0 && bFlag == TRUE)
    {
        /* 必须修改标志, 防止重复执行本段代
        码, 否则系统呈现挂起状态。*/
        bFlag = FALSE;
        //记下当前消息对应的时刻
        NowTime = pMsg->time;
        //定位到当前消息的前一条消息
        pos = EventMsgList.FindIndex(i - 1);
        //获取前一条消息
        pMsg = EventMsgList.GetAt(pos);
        //读出前一条消息对应的时刻
        PreTime = pMsg->time;
        /*该返回值表示当前消息被处理前
        系统应该等待的毫秒数, 在此返回前后两条消息之间的时
        间差"*/
        return NowTime - PreTime;
    }
    else return 0;
    break;
default:
    return CallNextHookEx(NULL, nCode, wParam,lParam);
}//end of switch (nCode)
return 0;

}

Chook::Chook()
//类构造函数
{
}
Chook::~Chook()
//类析构函数
{
stophook();
}
void Chook::starthook()
//安装钩子并设定接收显示窗口句柄
{
hHook = SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, AfxGetApp() -> m_hInstance, 0);
}
void Chook::stophook()
//卸载钩子
{

    UnhookWindowsHookEx(hHook);

}
void Chook::starthook1()
{
hHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, JournalPlaybackProc,AfxGetApp() ->m_hInstance,0);
}


2个回答

pzk110
pzk110 我就是根据这篇文献编写的程序,但是他的程序有一些问题
3 年多之前 回复
pzk110
pzk110 谢谢,应该很有帮助
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问