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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler