这是我尝试过的:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
cout << "Starting Notepad++..." << endl;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
// set the size of the structures
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&processInformation, sizeof(processInformation));
char commandLine[] = "C:\\Program Files\\Notepad++\\Notepad++.exe";
// start the program up
BOOL res = CreateProcess(NULL, // the path
commandLine, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&startupInfo, // Pointer to STARTUPINFO structure
&processInformation // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
);
if (res) {
if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, NULL, processInformation.dwThreadId))) {
cout << "Failed to install mouse hook :" << endl << getLastErrorAsString() << endl;
}
WaitForSingleObject( processInformation.hProcess, INFINITE );
CloseHandle( processInformation.hProcess );
CloseHandle( processInformation.hThread );
} else {
cout << "Failed to start Notepad++" << endl;
}
return 0;
}
它成功启动了Notepad ++,但是无法安装该挂钩,并且GetLastError返回以下错误:The parameter is incorrect.
。我不知道哪个参数不正确。但是,当我关闭Notepad ++时,程序正常完成。
由于我是在主程序中启动该进程的,并且该钩子回调也在主程序中,所以我应该能够在不进行任何dll注入的情况下安装钩子。
多年来我没有接触过c ++,而且我从未涉足系统开发,所以我这样做的方式可能是错误的,所以您能向我解释我的错误在哪里吗?
编辑:
所有人都告诉我,我需要注入一个dll来挂接特定进程,但这来自SetWindowsHookEx
的Windows文档中有关hMod参数(第3个参数)的信息:
包含钩子过程的DLL的句柄指向 lpfn参数。如果hMod参数必须设置为NULL dwThreadId参数指定当前进程创建的线程 并且挂钩程序是否在与 当前的过程。
我的线程是由当前进程创建的,而我的钩子程序位于当前进程的代码内,那么为什么当我使用非低级钩子(WH_MOUSE)时,它不起作用?
答案 0 :(得分:1)
在评估输入的目标之前执行低级钩子。这就是为什么低级挂钩需要全局的原因,如SetWindowsHookEx的文档中所述。您不能为 dwThreadId 参数传递非零值。