我正在制作一个基于教程的程序,并希望能够将我的代码挂接到某些应用程序中,以使教程与应用程序交互。
我的钩子代码适用于除谷歌浏览器之外的大多数应用程序。我已将我的代码精简为以下内容,因此您可以看到它出错了。
主文件
#include <Windows.h>
#include <iostream>
#include <psapi.h>
#include <Tlhelp32.h>
unsigned long GetProcId( const std::string& name )
{
unsigned long res = 0 ;
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processInfo ;
processInfo.dwSize=sizeof(PROCESSENTRY32W);
if( !Process32First( hSnapShot, &processInfo ) )
{
CloseHandle( hSnapShot );
return res ;
}
do
{
if( NULL != ( strstr ( strlwr ( processInfo.szExeFile ), name.c_str() ) ) )
{
res = processInfo.th32ProcessID ;
break ;
}
} while(Process32Next( hSnapShot,&processInfo ));
CloseHandle( hSnapShot ) ;
return res ;
}
typedef LRESULT (CALLBACK *DllHookProc)(int nCode, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
unsigned int processid = GetProcId( "chrome.exe" ) ;
if (processid == 0)
{
return 0 ;
}
HINSTANCE dllInstance = LoadLibrary("mydll.dll") ;
if (dllInstance == NULL)
{
return 0 ;
}
DllHookProc hookProc = (DllHookProc)::GetProcAddress(dllInstance, "HookProc");
if ( hookProc == NULL)
{
FreeLibrary(dllInstance);
return 0 ;
}
HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)hookProc,
dllInstance, processid );
if (hook == NULL)
{
FreeLibrary(dllInstance);
return 0 ;
}
return 0 ;
}
测试 Dll (mydll.dll)
LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam )
{
//Pass to the next chain in the process list
return CallNextHookEx( 0, nCode, wParam, lParam);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
定义文件
LIBRARY "MYDLL"
EXPORTS
HookProc @1
一切正常(包括获取 processId 和加载库和 getprocaddress)直到 SetWindowsHookEx 返回 NULL,错误代码为 87(无效参数)。
两者chrome.exe
和我的代码都是 32 位的。
这对其他人有用还是有人知道它不起作用?
谢谢