Я пишу программу, которая контролирует нажатия клавиш целевого процесса с использованием SetWindowsHookEx
. (IDE: Visual Studio 2013) Вот краткий обзор моей программы:Включение программы SetWindowsHookEx в режиме деблокирования, но работало в режиме отладки
- Получить
HWND
целевого процесса с использованиемFindWindow()
. - Если
HWND
действительно, получить идентификатор процесса с помощьюGetWindowThreadProcessId()
- Получить идентификатор потока путем обхода списка потоков с
CreateToolhelp32Snapshot(TH32CS_THREAD)
- Зов
SetWindowsHookEx()
.
Фактический код:
//obtain the window handle
HWND hwnd = FindWindowA(NULL, "A valid title");
DWORD pid = 0;
//obtain the process id.
GetWindowThreadProcessId(hwnd, &pid);
//obtain the thread id.
DWORD threadId = GetThreadId(pid);
printf("Injecting to Process: %d Thread: %d\n", pid, threadId);
HMODULE hDll = LoadLibraryA("TestDLL.dll");
if (hDll == INVALID_HANDLE_VALUE)
{
printf("LoadLibrary() failed! %d!\n", GetLastError());
return 0;
}
HOOKPROC hookproc = (HOOKPROC)GetProcAddress(hDll, "KeyboardProc");
if (!hookproc)
{
printf("GetProcAddress() failed\n");
return 0;
}
HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, hookproc, hDll, threadId);
if (!hook)
{
printf("SetWindowsHookEx() failed! %d\n", GetLastError());
return 0;
}
//post a message. This will trigger the hook and cause the target process
//to load my dll. Actual key monitoring code is inside the dll.
printf("SendMessage() returns:%d", SendMessage(hwnd, WM_NULL, 0, 0));
printf("Success!\n");
UnhookWindowsHookEx(hook);
getchar();
В режиме отладки, выходные шоу:
Injecting to process 4052 Thread:460
SendMessage() returns:0
Success!
Простой анализ показывает, что целевой процесс сделал загрузить мой DLL. Это означает, что программа работает. Тем не менее, в режиме деблокирования вывод одинаков, но dll не загружается в целевой процесс. Я пробовал это несколько раз с перезапуском целевого процесса каждый раз. Но все равно не работает. Как решить эту проблему?
Это комментарий, а не ответ. –
Я не перезапускал свою визуальную студию, поэтому разрешения для обоих режимов одинаковы. Плюс я просто дважды проверял: я все время работаю в режиме администратора, поэтому разрешение, безусловно, не проблема. –
Я хотел бы прокомментировать, но у меня нет 50 репутации, чтобы сделать это –