C++ SetWindowsHookEx与google chrome一起失败。错误代码87无效参数

C++ SetWindowsHookEx与google chrome一起失败。错误代码87无效参数,c++,windows,winapi,setwindowshookex,C++,Windows,Winapi,Setwindowshookex,我正在制作一个基于教程的程序,希望能够将我的代码连接到某些应用程序中,以使教程与应用程序交互 我的钩子代码适用于除google chrome之外的大多数应用程序。我已经将代码精简为以下内容,以便您可以看到它出错 Main.cpp #include <Windows.h> #include <iostream> #include <psapi.h> #include <Tlhelp32.h> unsigned long GetProcId( con

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

我的钩子代码适用于除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 ;
}
定义文件

LIBRARY "MYDLL"
EXPORTS
HookProc @1
在SetWindowsHookEx之前,一切正常(包括获取processId、加载库和getprocaddress),SetWindowsHookEx返回NULL,错误代码为87(无效参数)

chrome.exe和我的代码都是32位的

这对其他人有用吗?或者有人知道什么不起作用吗


谢谢

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


你的代码中有一个可疑的地方就是你没有打电话,这似乎是必须的。有关示例,请参阅:



最后一点建议:您正在将进程id传递给
SetWindowsHookEx
,但这需要一个线程id。

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


最肯定的是,你的
GetProcId
代码对chrome不起作用,因为它只找到一个匹配的进程。

谢谢你的回复,但它们都是32位的好位置,与Process32First匹配。我修复了代码,但不幸的是仍然存在相同的问题。再次感谢解决了这个问题非常感谢!但是chrome可能有很多线程在运行,所以有没有办法找到主GUI线程ID,这样我就知道在退出chrome之前不会卸载我的dll?再次感谢你帮了大忙抱歉,我不知道-我实际上不在windows上编码:-)问一个单独的问题。“但是chrome可能有很多线程在运行,所以有没有办法找到主GUI线程ID”-最好的办法是在chrome中找到你感兴趣的HWND,并使用GetWindowThreadProcessId获取该线程的线程ID。还建议使用Spy++检查windows是如何构造的,哪些进程/线程拥有它们——但请注意,Chrome可能会在将来的某个阶段改变它的工作方式。目前看来,除了一些插件窗口外,chrome中的所有HWD都属于同一个线程。
LIBRARY "MYDLL"
EXPORTS
HookProc @1