Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   глобальный хук (http://forum.oszone.net/showthread.php?t=311440)

амир-05 11-02-2016 13:58 2604921

глобальный хук
 
написал следующий код:
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;
        }

не работает:может я что то не дописал или упустил,не пойму.Помогите пожалуйста))

mrcnn 14-02-2016 11:53 2605918

Функция из 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;}



Время: 18:46.

Время: 18:46.
© OSzone.net 2001-