powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / хуки
13 сообщений из 13, страница 1 из 1
хуки
    #32928999
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пытаюсь разобраться с хуками в .НЕТ
задекларировал все что нужно для этого:
Код: 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.
сonst int WH_KEYBOARD = 2;

delegate int KeyboardProcEventHandler (int idHook, int wParam ,int lParam)


int hHook;
void SetHook()
{
  hHook = SetWindowsHookEx(WH_KEYBOARD,new KeyboardProcEventHandler(  KeyboardProc), Process.GetCurrentProcess.Handle, GetCurrentThreadId());
}


[DllImport("user32.dll")]
static extern int CallNextHookEx ( 
	 int hHook,
	 int ncode,
	 int wParam,
	 int lParam);

[DllImport("user32.dll", EntryPoint="SetWindowsHookExA")]
static extern int SetWindowsHookEx ( 
	 int idHook,
	 KeyboardProcEventHandler lpfn,
	 IntPtr hmod,
	 int dwThreadId);

[DllImport("user32.dll")]
static extern int UnhookWindowsHookEx ( 
	 int hHook);

[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId ();

...

int KeyboardProc (int idHook, int wParam ,int lParam)
{
  ....
}

...


в итоге hHook имеет значение 0 и никакой KeyboardProc не вызывается..
Что не так?
...
Рейтинг: 0 / 0
хуки
    #32929094
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не надо указавать хандл модуля. оставь его IntPtr.Zero

лучше вместо EntryPoint="SetWindowsHookExA" указать CharSet=CharSet.Auto

-----
PS (подробности):
HOW TO: Set a Windows Hook in Visual C# .NET

PPS (imho)
если меня приперает получить хук, то использую Application.AddMessageFilter
...
Рейтинг: 0 / 0
хуки
    #32929102
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузя
если меня приперает получить хук, то использую Application.AddMessageFilter
я честно говоря думал, что эта фича отлавливает сообщения тока для данного приложения и не реагирует на все остальные, разве это не так?
...
Рейтинг: 0 / 0
хуки
    #32929126
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так тебе нужен глобальный ... так бы и говорил.

правда в этой статейке
MSGlobal Hook Is Not Supported in .NET Frameworkно, похоже, что врут. видел я работающие реализации. если получится - напиши.
...
Рейтинг: 0 / 0
хуки
    #32929140
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, в этих программах использовался отлов на низком уровне, т.е. не WH_KEYBOARD, а WH_KEYBOARD_LL. вот последний вроде работает
...
Рейтинг: 0 / 0
хуки
    #32929146
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузятак тебе нужен глобальный ... так бы и говорил.

правда в этой статейке
MSGlobal Hook Is Not Supported in .NET Frameworkно, похоже, что врут. видел я работающие реализации. если получится - напиши.

мдя, глобального не получилось:-'((
...
Рейтинг: 0 / 0
хуки
    #32929152
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй:

Код: plaintext
1.
IntPtr hModule = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); // для EXE
int hHook = SetWindowsHookEx(WH_KEYBOARD, new KeyboardProcEventHandler(KeyboardProc), hModule, 0);
...
Рейтинг: 0 / 0
хуки
    #32929155
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для LL, естественно
...
Рейтинг: 0 / 0
хуки
    #32929164
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузяпопробуй:

Код: plaintext
1.
IntPtr hModule = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); // для EXE
int hHook = SetWindowsHookEx(WH_KEYBOARD, new KeyboardProcEventHandler(KeyboardProc), hModule, 0);


а у тебя так работает или ты не проверял, бо у меня нулевой результат..
...
Рейтинг: 0 / 0
хуки
    #32929166
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузядля LL, естественно

тоесть колбэк должен быть объявлен в другой длл или я не так понял?
...
Рейтинг: 0 / 0
хуки
    #32929216
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй такой вариант:
Код: 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.
public const int WH_KEYBOARD = 13/*2*/; //  реально WH_KEYBOARD_LL

delegate int KeyboardProcEventHandler(int idHook, int wParam, int lParam);

[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
static extern int SetWindowsHookEx(int idHook, KeyboardProcEventHandler lpfn,	IntPtr hmod, int dwThreadId);
[DllImport("User32.Dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
public static extern int CallNextHookEx(int CurrentHookHandle, int Code, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern int UnhookWindowsHookEx(int hHook);



private void Form1_Load(object sender, System.EventArgs e)
{
  kbd=new KeyboardProcEventHandler(KeyboardProc);
  IntPtr hModule = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); // для EXE
  hHook = SetWindowsHookEx(WH_KEYBOARD, kbd, hModule, 0);
}

private KeyboardProcEventHandler kbd;
private int	hHook;
private static	int c=0;

private  int KeyboardProc(int idHook, int wParam ,int lParam)
{
  this.label1.Text=c.ToString();
  c++;
  return CallNextHookEx(hHook, idHook, wParam, lParam);
}
...
Рейтинг: 0 / 0
хуки
    #32929231
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
небольшое замечаниеhHook = SetWindowsHookEx(WH_KEYBOARD, new KeyboardProcEventHandler(KeyboardProc), ...);так делать не надо. ты отдаешь делегат в unmanaged код. он не следит за объектами. для managed кода - этот делегат будет убит GC при ближайшей сборке мусора.
только через свою переменную, которая должна хранить делегат.
...
Рейтинг: 0 / 0
хуки
    #32930405
djamba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
делал хук для клавиатуры, программа сама на С# а вот dll для отлова глобального хук все же писал на С++ как сделать по другому не нашел...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / хуки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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