1

我正在制作一个基于教程的程序,并希望能够将我的代码挂接到某些应用程序中,以使教程与应用程序交互。

我的钩子代码适用于除谷歌浏览器之外的大多数应用程序。我已将我的代码精简为以下内容,因此您可以看到它出错了。

主文件

#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 位的。

这对其他人有用还是有人知道它不起作用?

谢谢

4

2 回答 2

2

您意识到 chrome 使用多进程模型,对吧?有许多 chrome 实例合作,其中一些可能没有事件队列。

最肯定的是,您的GetProcId代码不适用于 chrome,因为它只能找到一个匹配的进程。

于 2011-05-17T12:41:14.810 回答
0

一个可能的问题是,如果您正在构建 64 位代码,但却chrome.exe是 32 位(或相反)。[见评论和更新,事实并非如此。]


您的代码中有一件可疑的事情是您没有调用Process32First,这似乎是必需的。例如,请参阅:拍摄快照并查看进程


最后一个建议:您将进程 ID 传递给SetWindowsHookEx,但它需要一个线程 ID。

于 2011-05-17T11:27:21.083 回答