Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
5 / 5 / 2
Регистрация: 23.09.2013
Сообщений: 56

Как обработать сообщение из dll (хуки)

16.03.2014, 21:15. Показов 1038. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В проекте Windows Forms использую библиотеку для работы с хуками, написанную на с++. В коде библиотеки идет генерация сообщения, направленная на мою программу. Проблема в том, как корректно обработать это сообщение. Вариант который предлагает о великий MSDN c перегрузкой WndProc вылетает в StackOverflowException.

Как альтернативу можна использовать PostMessage(..) непосредственно полям моей формы для вывода информациии. Но что-то этот вариант не очень нравиться...

Хотелось бы услышать мнение умных людей по этому вопросу. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2014, 21:15
Ответы с готовыми решениями:

Хуки: обработать активацию любого окна
Пишу прогу, которая как только любое окошко будет активировано, обработает активацию окно и выдаст MessageBox. Ошибка во время...

Как достать и обработать иконки из dll со значками (shell32.dll)
Можно ли как-то взломать dll со значками(shell32.dll)

DLL Хуки, блокировка клавишных сочетаний
Всем привет! Нужна помощь по создания экрана блокировки в стиле MacOS X В интернете увидел такую и хочу попытаться сделать и безумно...

8
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
20.03.2014, 00:18
покажите код библиотеки. Ну и как работаете с dll в шарпе тоже лишним не будет.
0
5 / 5 / 2
Регистрация: 23.09.2013
Сообщений: 56
20.03.2014, 03:42  [ТС]
Долгие дни ожидания и наконец-то появились эксперты. Собственно проблема частично решена. Но вопросы остались. Как и просили, показываю коды библиотеки и ее использование в c#.
C++
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "stdafx.h"
#define SPYDLL_EXPORTS
#include "SpyDLL.h"
 
#define WM_WININFO_WINCLASSNAME (WM_USER + 1)
#define WM_WININFO_WINRECT (WM_USER + 2)
 
HINSTANCE hInstance;
HWND hWnd;
HHOOK hHook;
 
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    hInstance = (HINSTANCE)hModule;
    hHook = NULL;
 
    return TRUE;
}
 
SPYDLL_API LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    
    if (wParam == WM_LBUTTONUP)
    {
        POINT p;
        GetCursorPos(&p);
        hWnd = WindowFromPoint(p);
        
        TCHAR windowClassName[128];
        GetClassName(hWnd,windowClassName,128);
 
        LPRECT rect = new RECT();
        GetWindowRect(hWnd,rect);
 
        TCHAR buf[10] = L"";
        TCHAR info[128] = L"";
                
        _itow_s(rect->left,buf,10,10);
        wcscat_s(info,buf);
        wcscat_s(info,L"|");
 
        _itow_s(rect->top,buf,10,10);
        wcscat_s(info,buf);
        wcscat_s(info,L"|");
 
        _itow_s(rect->right,buf,10,10);
        wcscat_s(info,buf);
        wcscat_s(info,L"|");
 
        _itow_s(rect->bottom,buf,10,10);
        wcscat_s(info,buf);
        wcscat_s(info,L"|");
 
        HWND h = FindWindow(NULL,L"mini Spy");
        SendMessageA(h,WM_WININFO_WINCLASSNAME,(WPARAM)info,(LPARAM)windowClassName);
    }
 
    
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}
 
SPYDLL_API void setHook()
{
    hHook = SetWindowsHookEx(WH_MOUSE_LL,HookProc,hInstance,NULL);
}
 
SPYDLL_API void unHook()
{
    if (hHook != NULL)
        UnhookWindowsHookEx(hHook);
}
В проекте на c# через DllImport подключаю нужные методы
C#
1
2
3
4
5
[DllImport("SpyDLL.dll", EntryPoint = "?setHook@@YAXXZ")]
public static extern void setHook();
 
[DllImport("SpyDLL.dll", EntryPoint = "?unHook@@YAXXZ")]
public static extern void unHook();
и делаю переопределение процедуры WndProc(..)
C#
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
protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_WININFO_WINCLASSNAME: // сообщение описываю самостоятельно в виде константы
                    {
                        try
                        {
                            windowClassName = Marshal.PtrToStringAuto(m.LParam);
                            windowClassTextBox.Text = windowClassName;
 
                            rectParams = Marshal.PtrToStringAuto(m.WParam);
                            winRectangle = parseRectString(rectParams);
                            clientRectTextBox.Text = winRectangle.ToString();
                            positionOnScreenTextBox.Text = winRectangle.Left.ToString() + ";" + winRectangle.Top.ToString();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                    break;
            }
            base.WndProc(ref m);
        }
Более оптимальным решением было бы построить свою структуру в библиотеке. Заполнить данными и уже ее (точнее ссылку на нее) послать в сообщении. Но вот с этим и были большие проблеммы.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
20.03.2014, 11:13
Sat_Stud, а зачем Вам здесь нативная библиотека? Хук WH_MOUSE_LL прекрасно ставится из C#.

Обработка событий вне формы (глобальный перехват клавиш)
0
5 / 5 / 2
Регистрация: 23.09.2013
Сообщений: 56
21.03.2014, 22:21  [ТС]
В данном примере - это просто условие лабораторной работы. Но, просмотрев вашу рекомендацию, у меня возникает вопрос. Неужели ипользование нативной библиотеки будет менее эфективно, чем переписывать десятки строк кода по структурам и типам Win API и будет работать медленнее нескольких импортов из user32.dll и kernel.32 dll?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
21.03.2014, 23:15
Цитата Сообщение от Sat_Stud Посмотреть сообщение
Неужели ипользование нативной библиотеки будет менее эфективно
Не будет.
Цитата Сообщение от Sat_Stud Посмотреть сообщение
чем переписывать десятки строк кода по структурам и типам Win API
Допустим мы используем нативную библиотеку и HookProc находится в ней, нам всё-равно события из HookProc нужно пробрасывать в приложение на C# чтобы узнать о том что что-то поменялось, т.е. нужно будет реализовывать доп. функционал, который будет по объему равен тому что есть, а может немного меньше (передача делегата в нативную функцию для проброса событий, обработка сообщений в C# (WM_LBUTTONUP/etc). В данном случае проще импортировать несколько функций в C# и использовать их напрямую, благо это занимает от силы 5 минут.
0
5 / 5 / 2
Регистрация: 23.09.2013
Сообщений: 56
21.03.2014, 23:21  [ТС]
Согласен. А как на счет типов и стуктур из Win API. Все это надо переопределить же.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
21.03.2014, 23:32
Цитата Сообщение от Sat_Stud Посмотреть сообщение
Все это надо переопределить же
Да, не вижу в этом проблемы. Либо использовать структуры, либо без них но использовать методы с большим числом параметров, чтобы передать все данные из нативной DLL в приложение на C#.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
22.03.2014, 02:12
Да и вообще , на хуки мышки и клавы уже давно в NuGet есть готовые либы, хотя там и самому писать нечего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2014, 02:12
Помогаю со студенческими работами здесь

Почему функция, обрабатывающая хуки, должна быть в dll?
насколько я знаю, если ставишь глобальные хуки, нужно делать так, чтобы функция, обрабатывающая хуки, бралась из dll. Но только почему,...

Удалённые хуки. Когда для них нужно создавать *.dll, а когда необязательно?
Друзья! В туториалах Iczelion'а сказано просто: То тут то там вижу утверждения, что *.dll создавать необязательно, типа и так...

Как обработать сообщение WM_PAINTCLIPBOARD?
мне понадобилось написать юзерконтрол такого назначения: многострочный текстбокс, а котром поверх текста должна отрисовываться нестатичная...

Как правильно обработать сообщение?
не получается получить и обработать сообщение о считывании штрихкода сканером: в InitInstance() приложения зарегистрировал сообщение...

Как перехватить и обработать сообщение об ошибке?
Помогите перехватить и обработать сообщение об ошибке??? Задача состоит в следующем: В процессе обработки другого файла я через VBA...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru