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

时间:2011-05-17 11:19:14

标签: c++ windows winapi setwindowshookex

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

我的挂钩代码适用于除谷歌浏览器以外的大多数应用。我已将代码删除到以下内容,因此您可以看到它出错。

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

这对其他人有效还是有人知道它无效?

由于

2 个答案:

答案 0 :(得分:2)

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

当然,您的GetProcId代码无法用于Chrome,因为它只找到一个匹配的流程。

答案 1 :(得分:0)

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


您的代码中有一个可疑的事情是您没有调用Process32First,而这似乎是必需的。参见例如:Taking a Snapshot and Viewing Processes


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