Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2009, 13:43   #1
Katka
 
Регистрация: 10.09.2007
Сообщений: 6
По умолчанию Функция-фильтр глобального хука.

Доброго времени суток
Пишу приложение, где на окно ставится глобальный хук. Примеров на обычные функции много (по ним и писала), но понятных для обработчика не нашла
И dll и сама прога компилятся и линкуются, но dll в приложение не подгружается и фильтр хука не работает.
Буду очень благодарна всем, кто поможет разобраться.
Вот dll:
Код:
#define _AFXDLL
#define EXPORT extern "C" __declspec(dllexport)
#include "afxwin.h"
#include "stdafx.h"
#include <windows.h>
#include <WinUser.h>
#include <stdio.h>

LPEVENTMSG EventMSG;
EXPORT (LRESULT CALLBACK JournalRecordProc(int, WPARAM, LPEVENTMSG));
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	break;

	case DLL_PROCESS_DETACH:
	break;

	default:
	return TRUE;
	}
return FALSE;
}
EXPORT (LRESULT CALLBACK JournalRecordProc (int hc_Act, WPARAM wp, LPEVENTMSG EventMSG))// LPARAM tagEventMSG)
{
	FILE* fp;
	fp = fopen ("journal_temp.txt","w");
	fprintf(fp, "%d\n", EventMSG->message);
	fprintf(fp, "%d\n", EventMSG->paramL);
	fprintf(fp, "%d\n", EventMSG->paramH);
	fprintf(fp, "%s\n", EventMSG->time);
	fprintf(fp, "%s\n", EventMSG->hwnd);
	fprintf(fp, "%x\n", EventMSG->hwnd);
	fclose (fp);
	return 1;
}
Вот приложение:
Код:
#pragma once
#define _AFXDLL
#define WINVER 0x0501
#include "afxwin.h"
#include <windows.h>
//#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name
HBITMAP handle;
BITMAP bit;
CBitmap *bm;
/////////////////////////////////////////////////////////////////
HMODULE hdll;
HOOKPROC hkprcSysMsg;
static HHOOK hhookSysMsg;
////////////////////////////////////////////////////////////////
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
{
	if(GetWindowThreadProcessId(hwnd, NULL) == GetCurrentThreadId())
	{
		*(HWND*)lParam = hwnd;
		return FALSE;
	}
	return TRUE;
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow)
{
	MSG msg;
	MyRegisterClass(hInstance);
	InitInstance(hInstance, nCmdShow);
	hdll = LoadLibrary ("hook_filtr.dll");
	while(GetMessage(&msg, 0, 0, 0))
	{
	hkprcSysMsg = (HOOKPROC)GetProcAddress(hdll, "JournalRecordProc");
	hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER, hkprcSysMsg, hdll, 0);
	TranslateMessage(&msg);
	DispatchMessage(&msg);
	}
return 0;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASS wcex;
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= (LPCTSTR)"Class";

	return RegisterClass(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance;
   handle = (HBITMAP)LoadImage(GetModuleHandle(0), "pict1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
   bm = CBitmap::FromHandle(handle);
   bm->GetBitmap(&bit);
   hWnd = CreateWindow((LPCTSTR)"Class", (LPCTSTR)"Title", WS_OVERLAPPEDWINDOW,
      0, 0, bit.bmWidth, bit.bmHeight, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	BITMAP bmpInfo = {};
	WINDOWINFO w_info;
	switch (message)
	{
	case WM_CREATE:
		break;
	case WM_PAINT:

		hdc = BeginPaint(hWnd, &ps);
		{
		   CClientDC cdc(NULL);
		   CDC dc;
		   dc.CreateCompatibleDC(&cdc);
		   dc.SelectObject(bm);
		   GetWindowInfo(hWnd, &w_info);
		   cdc.StretchBlt (w_info.rcWindow.left, w_info.rcWindow.top, (w_info.rcWindow.right-w_info.rcWindow.left),
			   (w_info.rcWindow.bottom-w_info.rcWindow.top), 
			   &dc, 0, 0, bit.bmWidth, bit.bmHeight, SRCCOPY);
		   dc.DeleteDC();
		}
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		UnhookWindowsHookEx(hhookSysMsg);
		FreeLibrary (hdll);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Katka вне форума Ответить с цитированием
Старый 29.03.2009, 17:50   #2
Katka
 
Регистрация: 10.09.2007
Сообщений: 6
По умолчанию

Проблема трансформировалась.
1. Подскажите, как отработать выпадение из хука? а то виснем чутка насмерть...
2. Где регистрировать хук? В цикле сообщений или раньше?
Katka вне форума Ответить с цитированием
Старый 29.03.2009, 19:49   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Katka Посмотреть сообщение
1. Подскажите, как отработать выпадение из хука? а то виснем чутка насмерть...
непонятно, подробнее пожалуйста

Цитата:
Сообщение от Katka Посмотреть сообщение
2. Где регистрировать хук? В цикле сообщений или раньше?
регистрировать хук можно где угодно
rpy3uH вне форума Ответить с цитированием
Старый 30.03.2009, 10:57   #4
Katka
 
Регистрация: 10.09.2007
Сообщений: 6
По умолчанию

Куда вставлять UnhookWindowsHookEx? Сразу после регистрации или в фильтр в теле dll?
Дело в том, что запись событий надо производить периодически - записали, отправили, отработали результат - и так до закрытия окна.
Katka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как мне в обработчике хука узнать хендл окна? vitalik007 Win Api 5 16.05.2008 09:34
Фильтр Инночка Помощь студентам 4 30.04.2008 20:27
фильтр в DBGrid ГОСЕАН БД в Delphi 10 09.02.2008 12:51
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50