我正在制作一个基于教程的程序,希望能够将我的代码挂钩到某些应用程序中,以使教程与应用程序进行交互。
我的挂钩代码适用于除谷歌浏览器以外的大多数应用。我已将代码删除到以下内容,因此您可以看到它出错。
Main.cpp的
#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位。
这对其他人有效还是有人知道它无效?
由于
答案 0 :(得分:2)
您意识到Chrome使用的是多进程模型,对吧?有许多chrome实例在合作,其中一些可能没有事件队列。
当然,您的GetProcId
代码无法用于Chrome,因为它只找到一个匹配的流程。
答案 1 :(得分:0)
一个可能的问题是,如果你正在构建64位代码,但chrome.exe
是32位(或者相反)。 [见评论&amp;更新,情况并非如此。]
您的代码中有一个可疑的事情是您没有调用Process32First
,而这似乎是必需的。参见例如:Taking a Snapshot and Viewing Processes。
最后一个建议:您将进程ID传递给SetWindowsHookEx
,但是需要一个线程ID。