SetWindowsHookEx失败,谷歌浏览器。错误代码87无效参数

| 我正在制作一个基于教程的程序,希望能够将我的代码挂接到某些应用程序中,以使该教程与该应用程序进行交互。 我的摘机代码适用于Google chrome以外的大多数应用。我将代码简化为以下内容,因此您可以看到它出错了。 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位。 这是否对其他任何人有用,或者有人知道它不起作用吗? 谢谢     
已邀请:
一个可能的问题是,如果您要构建64位代码,但是
chrome.exe
是32位(或者相反)。 [请参阅评论和更新,情况并非如此。] 您的代码中有一个可疑的事情是您没有调用
Process32First
,而这似乎是必需的。参见示例:拍摄快照和查看过程。 最后建议:您正在将进程ID传递给
SetWindowsHookEx
,但这需要一个线程ID。     
您意识到chrome使用了多进程模型,对吗?有许多协作的Chrome实例,其中有些可能没有事件队列。 可以肯定的是,您的
GetProcId
代码不适用于chrome,因为它只能找到一个匹配的进程。     

要回复问题请先登录注册