C++ SetWindowsHookEx与google chrome一起失败。错误代码87无效参数
我正在制作一个基于教程的程序,希望能够将我的代码连接到某些应用程序中,以使教程与应用程序交互 我的钩子代码适用于除google chrome之外的大多数应用程序。我已经将代码精简为以下内容,以便您可以看到它出错 Main.cppC++ 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
#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