Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - глобальный хук

Ответить
Настройки темы
C/C++ - глобальный хук

Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


написал следующий код:
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);
	}
}
dll.cpp:
Код: Выделить весь код
Код: Выделить весь код
#include<windows.h>
#include<iostream>
#define DllExport extern"C" __declspec(dllexport)
HHOOK _hook;
DllExport LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam){
	std::cout<<wParam;
	std::cout<<123;
	}
не работает:может я что то не дописал или упустил,не пойму.Помогите пожалуйста))

Отправлено: 13:58, 11-02-2016

 

Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить 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;}

-------
Ehhh.. what's up, doc?..


Отправлено: 11:53, 14-02-2016 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - глобальный хук

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Глобальный поиск по 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




 
Переход