SetWindowsHookEx не работает с Google Chrome.Код ошибки 87 неверный параметр - PullRequest
1 голос
/ 17 мая 2011

Я создаю программу на основе учебника и хочу иметь возможность подключать свой код к определенным приложениям, чтобы учебник взаимодействовал с приложением.

Мой код подключения работает для большинства приложений, кроме 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 ;
}

Test 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 ]

2 голосов
/ 17 мая 2011

Вы понимаете, что Chrome использует многопроцессорную модель, верно?Существует множество взаимодействующих экземпляров Chrome, и некоторые из них могут не иметь очереди событий.

Скорее всего, ваш код GetProcId не будет работать для Chrome, поскольку он находит только один соответствующий процесс.

0 голосов
/ 17 мая 2011

Одной из возможных проблем может быть, если вы создаете 64-битный код, но chrome.exe является 32-битным (или наоборот). [См. Комментарий и обновление, это не так.]


Одна подозрительная вещь в вашем коде заключается в том, что вы не звоните Process32First, и это, похоже, требуется. Например: Создание снимка и просмотр процессов .


Последнее предложение: вы передаете идентификатор процесса на SetWindowsHookEx, но он ожидает идентификатор потока.

...