|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - глобальный хук |
|
C/C++ - глобальный хук
|
Новый участник Сообщения: 21 |
написал следующий код:
main.cpp: #include<windows.h> #include<iostream> using namespace std; int main(){ HOOKPROC func; HHOOK _hook; int ncode=15; WPARAM wParam; LPARAM lParam; MSG msg; HINSTANCE hinstDLL; hinstDLL=LoadLibrary("dll.dll"); (FARPROC &)func = GetProcAddress(hinstDLL,"KeyProc@12"); _hook=SetWindowsHookEx(WH_KEYBOARD,func,hinstDLL,0); while(1){ PeekMessage(&msg,NULL,0,0,0); } } не работает:может я что то не дописал или упустил,не пойму.Помогите пожалуйста)) |
|
Отправлено: 13:58, 11-02-2016 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать Функция из dll не проэкспортировалась, имя нужно из obj файла вытаскивать.
Пример: #include <windows.h> #include <stdio.h> #pragma comment(lib, "user32.lib") #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "gdi32.lib") #ifdef __cplusplus extern "C" { #endif FILE *f; DWORD coord; __declspec(dllexport) void f1() { printf("f()\n"); } __declspec(dllexport) LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) { POINT pnt; GetCursorPos(&pnt); switch(wParam) { case VK_HOME: coord = pnt.y; coord <<= 16; coord |= pnt.x; SendMessage(GetActiveWindow(), WM_LBUTTONDBLCLK, MK_LBUTTON, coord); break; case VK_END: coord = pnt.y; coord <<= 16; coord |= pnt.x; SendMessage(GetActiveWindow(), WM_RBUTTONDBLCLK, MK_RBUTTON, coord); break; case VK_LEFT: pnt.x -=5; break; case VK_RIGHT: pnt.x +=5; break; case VK_UP: pnt.y -= 5; break; case VK_DOWN: pnt.y +=5;break; } SetCursorPos(pnt.x, pnt.y);return CallNextHookEx(0, code, wParam, lParam);} #ifdef __cplusplus } #endif #include <windows.h> #include <d3dx9.h> #include <stdio.h> #include <tchar.h> #include <stdlib.h> #pragma comment(lib, "user32.lib") #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "gdi32.lib") typedef void (__cdecl* KPROC)(); KPROC tt;WNDCLASSEX wc; MSG msg; HWND hwnd;HOOKPROC hkp;HOOKPROC hkp2;HOOKPROC hkp3;HINSTANCE hinstdll;HHOOK hhook;HHOOK hhook2;HHOOK hhook3;HOOKPROC KeyboardProc;HOOKPROC GetMsgProc;HOOKPROC SysMsgProc;HWND ghwnd;WORD coord; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ static POINT pnt;switch (uMsg){ case WM_LBUTTONDBLCLK: printf("lb\n"); break; case WM_RBUTTONDBLCLK: printf("rb\n"); break; case WM_CREATE:ghwnd = hwnd;break;case WM_KEYDOWN:GetCursorPos(&pnt);switch(wParam){case VK_HOME: coord = pnt.x; coord <<= 8; coord |= pnt.y; SendMessage(ghwnd, WM_LBUTTONDBLCLK, MK_LBUTTON, coord); break; case VK_END: coord = pnt.x; coord <<= 8; coord |= pnt.y; SendMessage(ghwnd, WM_RBUTTONDBLCLK, MK_RBUTTON, coord);break;case VK_LEFT:pnt.x -=5;break;case VK_RIGHT:pnt.x +=5;break;case VK_UP: pnt.y -= 5;break;case VK_DOWN:pnt.y +=5;break;}SetCursorPos(pnt.x, pnt.y);return 0;case WM_DESTROY:PostQuitMessage(NULL);return 0;case WM_PAINT:return 0;default: return DefWindowProc(hwnd, uMsg,wParam, lParam);} return DefWindowProc(hwnd, uMsg,wParam, lParam);} int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR CmdLine, int CmdShow) { wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "SimpleWinClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm =LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClassEx(&wc); hwnd = CreateWindowEx(NULL, "SimpleWinClass", "W2", WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInst, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;} int main(int argc, char* argv[]) { HINSTANCE hInstance = GetModuleHandle(0); LPSTR CommandLine = GetCommandLine(); // Получение хэндла к DLL осуществляется функцией LoadLibrary с аргументом в виде имени DLL// хэндл к DLL hinstdll = LoadLibrary(TEXT("hookdll.dll")); if (hinstdll == 0) printf("hinstdll\n"), exit(0); tt = (KPROC)GetProcAddress(hinstdll, "f1"); if (tt == 0) printf("tt = 0: %x\n", GetLastError()); else tt(); // GetProcAddress используется для получения адресов функций в модуле DLL// получение адресов функций в DLL hkp = (HOOKPROC)GetProcAddress(hinstdll, "_KeyboardProc@12"); if (hkp == 0) printf("hkp = 0: %x\n", GetLastError()); //hkp2 = (HOOKPROC)GetProcAddress(hinstdll, "_GetMsgProc@12"); if (hkp2 == 0) printf("hkp2 = 0: %x\n", GetLastError()); //hkp3 = (HOOKPROC)GetProcAddress(hinstdll, "_f2@12"); if (hkp3 == 0) printf("hkp3 = 0: %x\n", GetLastError()); // Функция SetWindowsHookEx инсталлирует процедуру захвата и специфицирует тип процедуры захвата,// определяет должна ли эта процедура захвата ассоциироваться со всеми потоками на том же десктопе// или с отдельноым потоком и указатель на входную точку в процедуру// ГЛОБАЛЬНЫЙ ХУК помещается в DLL отдельно от приложения использующего хук.// Приложение, инсталлирующее хук, должно иметь хэндл к модулю DLL, чтобы использовать процедуру захвата// SetWindowsHookEx// первый аргумент: тип инсталлируемой процедуры захвата// WH_KEYBOARD мониторит сообщения клавиатуре// второй аргумент: указатель на процедуру захвата // третий аргумент: хэндл dll содержащей второй аргумент// четвертый аргумент: определяет индентификатор потока, с которым ассоциирована процедура захвата. // если этот параметр ноль, то процедура захвата ассоциирована со всеми потоками на десктопе// NTVDM hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) hkp, hinstdll, 0); if (hhook == 0) printf("hhook = 0: %x\n", GetLastError()); //hhook2 = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) hkp2, hinstdll, 0); if (hhook2 == 0) printf("hhook2= 0: %x\n", GetLastError()); //hhook3 = SetWindowsHookEx(WH_SYSMSGFILTER, hkp3, hinstdll, 0); if (hhook3 == 0) printf("hhook3= 0: %x\n", GetLastError()); //else //printf("%x\n"); HRESULT hresult = WinMain(hInstance, NULL,CommandLine, SW_SHOWDEFAULT); UnhookWindowsHookEx(hhook); //UnhookWindowsHookEx(hhook2); //UnhookWindowsHookEx(hhook3); return 0;} |
------- Отправлено: 11:53, 14-02-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Глобальный поиск по FTP - как? | illusionmgs | Хочу все знать | 3 | 04-04-2011 06:04 | |
Глобальный рынок серверов растет рекордными темпами | OSZone News | Новости информационных технологий | 0 | 26-08-2010 18:30 | |
Глобальный рынок микросхем демонстрирует позитивный рост | OSZone News | Новости информационных технологий | 0 | 01-12-2009 01:30 | |
[решено] Глобальный каталог в дочернем домене | SanyaJoker | Microsoft Windows NT/2000/2003 | 33 | 28-04-2009 14:47 | |
Win2000 server глобальный каталог | Guest | Microsoft Windows NT/2000/2003 | 6 | 06-07-2004 12:22 |
|