Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / хуки / 13 сообщений из 13, страница 1 из 1
22.02.2005, 17:23
    #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
22.02.2005, 17:48
    #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
22.02.2005, 17:50
    #32929102
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хуки
кузя
если меня приперает получить хук, то использую Application.AddMessageFilter
я честно говоря думал, что эта фича отлавливает сообщения тока для данного приложения и не реагирует на все остальные, разве это не так?
...
Рейтинг: 0 / 0
22.02.2005, 17:58
    #32929126
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хуки
так тебе нужен глобальный ... так бы и говорил.

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

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

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

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

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


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

тоесть колбэк должен быть объявлен в другой длл или я не так понял?
...
Рейтинг: 0 / 0
22.02.2005, 18:50
    #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
22.02.2005, 19:00
    #32929231
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хуки
небольшое замечаниеhHook = SetWindowsHookEx(WH_KEYBOARD, new KeyboardProcEventHandler(KeyboardProc), ...);так делать не надо. ты отдаешь делегат в unmanaged код. он не следит за объектами. для managed кода - этот делегат будет убит GC при ближайшей сборке мусора.
только через свою переменную, которая должна хранить делегат.
...
Рейтинг: 0 / 0
24.02.2005, 09:19
    #32930405
djamba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хуки
делал хук для клавиатуры, программа сама на С# а вот dll для отлова глобального хук все же писал на С++ как сделать по другому не нашел...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / хуки / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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