以下是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;
}