kf3567 2020-03-30 17:53 采纳率: 0%
浏览 396

【求助】SetWindowsHookEx返回为NULL,使用GetLastError得到结果87,不知道错在哪里

最近看windows钩子,但是自己按照别人的帖子写,总是不成功,求助各位大佬,看看是为什么。
使用的是VS 2017,系统环境是WIN10

//plugin.dll中的部分代码
LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    if ((wParam == VK_HOME) && (lParam&(1 << 31)) == 0)
    {
        MessageBox(NULL, L"alert", L"你好,test", MB_OKCANCEL);
        if (dlgForm == NULL) {
            dlgForm = new CPwin;
            dlgForm->Create(IDD_DLG_MAIN);
        }
        dlgForm->ShowWindow(SW_SHOW);
    }
    return CallNextHookEx(0, code, wParam, lParam);
}
HHOOK __stdcall SetKeyBoardHook(DWORD dwThreadId)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    HMODULE hPlugin = GetModuleHandle(L"plugin.dll");//项目生成的是plugin.dll
    //可以跟踪到这里,hPlugin指针正常
    //返回钩子指针一直是NULL
    KeyBoardHookId = SetWindowsHookEx(WH_KEYBOARD, &KeyBoardProc, hPlugin, dwThreadId);
    //获取到错误为87
    DWORD re = GetLastError();
    return KeyBoardHookId;
}

//主程序代码相关代码

using namespace std;
list<HWND> m_hwndFind = list<HWND>();
map<HWND, HHOOK> m_hwndHooked = map<HWND, HHOOK>();

void CHookTestDlg::OnBnClickedBtnStart()
{
    // TODO: 在此添加控件通知处理程序代码
    m_hwndFind.clear();
    list<HWND>().swap(m_hwndFind);

    EnumWindows(CHookTestDlg::EnumWindowsProc, NULL);
    list<HWND>::iterator itor;
    for (itor = m_hwndFind.begin(); itor != m_hwndFind.end(); itor++) {
        if (m_hwndHooked.count(*itor) == 0) {
            char cTitle[129] = { 0 };
            GetWindowTextA(*itor, cTitle, 128);
            //GetClassNameA(*itor, cTitle, 128);
            if (strcmp(cTitle, "计算器") == 0) {
                DWORD dwProcId;
                GetWindowThreadProcessId(*itor, &dwProcId);
                HHOOK hook = (HHOOK)SetKeyBoardHook(dwProcId);
                m_hwndHooked[*itor] = hook;
            }
        }
    }
}

BOOL CHookTestDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    if (::GetWindowLong(hWnd, GWL_STYLE)&WS_VISIBLE)
    {
        m_hwndFind.push_back(hWnd);
        EnumChildWindows(hWnd, CHookTestDlg::EnumWindowsProc, NULL);
    }
    return TRUE;
}

  • 写回答

1条回答 默认 最新

  • kawhi-ewing 2021-01-08 17:58
    关注

    解决了嘛?

     

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。