pzk110 2017-04-27 03:33 采纳率: 0%
浏览 1034

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

我参考文献写了以下代码,设置动态链接库再用对话框嗲用,但是在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条回答 默认 最新

  • devmiao 2017-04-27 06:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?