SetWindowsHookEx не работает на бета2 x64 - PullRequest
0 голосов
/ 23 октября 2009

Вздох, у меня есть некоторый код из codeproject (http://www.codeproject.com/KB/cs/globalhook.aspx) для перехвата глобальных событий клавиатуры и мыши. Внезапно теперь, когда я установил бета-версию 2 Visual Studio 2010 и .net Framework 4.0, я ломаюсь в этом коде:

            hKeyboardHook = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                KeyboardHookProcedure,
                Marshal.GetHINSTANCE(
                Assembly.GetExecutingAssembly().GetModules()[0]),
                0);

О, и я работаю на машине X64. Кто-нибудь знает способ обойти это? Не легко исправить, я знаю ..

Ответы [ 2 ]

0 голосов
/ 27 июля 2012

Оставьте параметр Instance равным 0. Кажется, что XP требует этого, но win7 этого не делает.

hKeyboardHook = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                KeyboardHookProcedure,
                0,
                0);
0 голосов
/ 13 апреля 2011

Недавно сделал это для моего проекта. Отлично работает ) Я почти уверен, что речь идет о 2-м и 3-м аргументах.

1 упаковка KeyboardHookProcedure (), например:

//declate delegate type:
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

//use a class member of this type and inject your callback into
m_hookproc = new HookProc(HookCallbackProcedure);

2 для третьего аргумента:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);

3 Будьте осторожны с Marshal.GetLastWin32Error (), вы должны использовать его строго после метода, который вы проверяете на наличие ошибок. ( см. Это правило fxcop )

вся картинка выглядит следующим образом:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
IntPtr handle = SetWindowsHookEx(   WH_KEYBOARD_LL, m_hookproc, hInstance,  0);
if (handle == IntPtr.Zero)
{
  int  error = Marshal.GetLastWin32Error();
  //log the error or whatever
}

вот и все)

...