名字不能取太长 2022-08-02 13:32 采纳率: 78%
浏览 76
已结题

以下dll注入到进程中后消息处理函数不执行

以下是dll的代码,使用远程线程注入进进程后无法处理消息循环(比如按下菜单1应该有弹窗但是并没有而且窗口不会阻塞),调试发现oldfun值始终为0,请问代码哪里有问题呀


#include "pch.h"
#include<Windows.h>
#include"resource.h"
#include<WinUser.h>

WNDPROC oldfun = NULL;  //原来的过程处理函数要保留
LRESULT CALLBACK NewWindowProc(HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    if (uMsg == WM_COMMAND)
    {
        switch (LOWORD(wParam))
        {
        case ID_MENU_1:
        {
            MessageBox(hWnd, "this is 1", NULL, MB_OK);
            break;
        }
        case ID_MENU_2:
        {
            MessageBox(hWnd, "this is 2", NULL, MB_OK);
            break;
        }
        case ID_MENU_3:
        {
            MessageBox(hWnd, "this is 1", NULL, MB_OK);
            break;
        }
        default:
            break;
        }
    }
    return oldfun(hWnd, uMsg, wParam, lParam);
}

BOOL init(HMODULE hModule)
{
    //获取窗体句柄,设置菜单
    HMENU hm=LoadMenu(hModule, MAKEINTRESOURCE(IDR_MENU1));
    HWND hw = FindWindow(NULL, "A");
    SetMenu(hw, hm);
    if (hm == NULL || hw == NULL)
    {
        return FALSE;
    }
    
    //替换原有过程函数
    oldfun = (WNDPROC)SetWindowLong(hw, GWLP_WNDPROC, (LONG)NewWindowProc);
    return TRUE;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        
        if (init(hModule))
        {
            MessageBox(FindWindow(NULL, "A"), "finish!", "notice", MB_OK);
        }
        else
        {
            MessageBox(FindWindow(NULL, "A"), "Fail!", "notice", MB_OK);
        }
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
  • 写回答

2条回答 默认 最新

  • churuxu 2022-08-02 15:34
    关注
    oldfun = (WNDPROC)SetWindowLong(hw, GWLP_WNDPROC, (LONG)NewWindowProc);
    

    改为

    oldfun = (WNDPROC)SetWindowLongPtr(hw, GWLP_WNDPROC, (LONG_PTR)NewWindowProc);
    

    试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月11日
  • 已采纳回答 8月3日
  • 创建了问题 8月2日

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图