powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / глобальний Hook в dll проблема с PostMessage
5 сообщений из 5, страница 1 из 1
глобальний Hook в dll проблема с PostMessage
    #37007735
Galbarad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все привет, вот для общего развития написать глобальний хук клавиатури.
функция в длл получает сообщения от приложений но не передает сообщения моему приложению
лог дллки показывает что все правильно сообщение получаеться успешно отправляються окну и хендл правильный. Но моему приложению абсолютно ничего не приходит целый день уже бюсь над етим. Помогите пожалуста.

код длл-ки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
#pragma once

#include <windows.h>
#include <strsafe.h>
#include <fstream>

#pragma comment(lib, "user32.lib") 
#pragma comment(lib, "gdi32.lib")

#define WM_GLBHOOK WM_USER +  324 

#pragma data_seg("MYSEG")
HWND KeyWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:MYSEG,RWS")

HHOOK KeyHook = NULL;

LRESULT CALLBACK ghpGlobalKeyboard(int nCode, WPARAM wParam, LPARAM lParam) {
	std::ofstream ofsFileLog;
	ofsFileLog.open("e:\\tmp\\key_hook.log", std::ios::app);
	ofsFileLog << "KeyWnd = " << KeyWnd << " wParam = " << wParam << " lParam = " << lParam;
	if (KeyWnd != NULL) {
		if (PostMessage(KeyWnd, WM_GLBHOOK, wParam, lParam)) {
			ofsFileLog << " Message posted";
		} else {
			DWORD le = GetLastError();
			ofsFileLog << " Error message posted LastError = " << le;
		}
	}
	ofsFileLog << std::endl;
	
	ofsFileLog.close();
	return  0 ;
}

extern "C" __declspec(dllexport) BOOL setGlobalKeyHook(HWND hHostWnd, HINSTANCE hInst, LPVOID reserved) {
	if (KeyHook == NULL) {
		KeyWnd = hHostWnd;
		KeyHook = SetWindowsHookEx(WH_KEYBOARD, ghpGlobalKeyboard, hInst,  0 );
		return KeyHook != NULL;
	} else {
		return false;
	}
}

extern "C" __declspec(dllexport) BOOL unsetGlobalKeyHook() {
	if (KeyHook != NULL) {
		UnhookWindowsHookEx(KeyHook);
		KeyWnd = NULL;
	}
	return KeyHook == NULL;
}

код приложения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
#include "stdafx.h"
#include <Windows.h>
#include <fstream>
#include <stdio.h>

#define WM_GLBHOOK WM_USER +  324 

typedef BOOL (*setGlobalKeyHookFunc)(HWND hHostWnd, HINSTANCE hInst, LPVOID reserved);
typedef BOOL (*unsetGlobalKeyHookFunc)(void);

int _tmain(int argc, _TCHAR* argv[])
{
	int Res =  0 ;
	HINSTANCE hinstDLL = LoadLibrary(L"e:\\Work\\Cpp\\Hook\\glbhook\\Release\\glbhook.dll"); 

	if (hinstDLL) {
		setGlobalKeyHookFunc setGlobalKeyHook = NULL;
		setGlobalKeyHook = (setGlobalKeyHookFunc)GetProcAddress(hinstDLL, "setGlobalKeyHook");
		
		if (setGlobalKeyHook != NULL) {
			HWND hInstC = GetConsoleWindow();
			if (setGlobalKeyHook(hInstC, hinstDLL,  0 )) {

				MSG msg;
				BOOL bRet;
				std::ofstream ofsFileLog;
				ofsFileLog.open("key_hook.log", std::ios::app);
				while((bRet = GetMessage(&msg, hInstC,  0 ,  0 )) !=  0 ) {
					if (bRet == - 1 ) {
						break;
					} else {
						TranslateMessage(&msg); 
						DispatchMessage(&msg); 
						ofsFileLog << "Msg = " << msg.message << " time = " << msg.time << " WParam = " << msg.wParam << " LParam = " << msg.lParam << std::endl;
					}
				}
				ofsFileLog.close();
				unsetGlobalKeyHookFunc unsetGlobalKeyHook = (unsetGlobalKeyHookFunc)GetProcAddress(hinstDLL, "unsetGlobalKeyHook");
				unsetGlobalKeyHook();
			}
		}
		FreeLibrary(hinstDLL);
	}
	return  0 ;
}
...
Рейтинг: 0 / 0
глобальний Hook в dll проблема с PostMessage
    #37007824
Galbarad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перед циклом GetMessage добавил вот такой код
Код: plaintext
1.
2.
3.
4.
				if (!PostMessage(hInstC, WM_GLBHOOK,  0 ,  0 )) {
					ofsFileLog << "Last Error = " << GetLastError() << std::endl;   
				} else {
					ofsFileLog << "Sucessfull send message to self" << std::endl;   
				}
и всеравно в цикле ничего не получаю
голова уже пухнет немогу понять в чем проблема
...
Рейтинг: 0 / 0
глобальний Hook в dll проблема с PostMessage
    #37011826
Galbarad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вияснился интересный нюанс
приложение получает сообщения только если клавиши нажимаються в окне приложения
а если в какомто другом окне то не получает
хотя длл исправно логирует все нажатия и в логи записывает правильный хендл окна

да и почемуто сколько раз я не нажму клавишу получаю только 2 сообщения
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
глобальний Hook в dll проблема с PostMessage
    #38159739
lenivec2.0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GalbaradВияснился интересный нюанс
приложение получает сообщения только если клавиши нажимаються в окне приложения
а если в какомто другом окне то не получает
хотя длл исправно логирует все нажатия и в логи записывает правильный хендл окна

да и почемуто сколько раз я не нажму клавишу получаю только 2 сообщения

Попробуйте заменить KeyHook = SetWindowsHookEx(WH_KEYBOARD, ghpGlobalKeyboard, hInst, 0);
на KeyHook = SetWindowsHookEx(WH_KEYBOARD, ghpGlobalKeyboard, NUUL, 0);
...
Рейтинг: 0 / 0
глобальний Hook в dll проблема с PostMessage
    #38184637
Galbarad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lenivec2.0,

спасибо, если наткнусь еще на етот проект обязательно попробую
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / глобальний Hook в dll проблема с PostMessage
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]