PInvoke ошибки вызова внешних SetWindowsHookEx и GetModuleHandle - PullRequest
2 голосов
/ 15 октября 2011

Я пытаюсь установить хуки окон в моей программе на внешний EXE. Это будет использоваться для контроля изменения размера / минимизации окна, поэтому я могу изменить размер моей программы аналогично, пристыковываясь к окну.

Как мне обойти коды ошибок 1428 и 126 ниже?

При вызове SetWindowsHookEx с нулевым значением hMod я получаю эту ошибку 1428 . Я получаю ту же ошибку при прохождении текущего модуля (вместо IntPtr.Zero), который, кажется, получится правильно, так:

IntPtr module = PInvoke.GetModuleHandle(null);
[...]
SetWindowsHookEx(...,...,module,...);
int error = PInvoke.GetLastError();

1428 = Невозможно установить нелокальный крюк без ручки модуля

Я также пытался захватить внешнюю программу, которую я подключаю как модуль, используя GetModuleHandle :

IntPtr module = PInvoke.GetModuleHandle("communicator.exe");
int error = PInvoke.GetLastError();

Но ошибка затем устанавливается на:

126 = Указанный модуль не найден.

Я использую следующие операторы PInvoke:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);

Эта процедура вызывает проблему:

public void Install(IntPtr hWnd)
    {
        uint threadId;
        uint processId;

        if (hWnd == IntPtr.Zero)
        {
            threadId = (uint)AppDomain.GetCurrentThreadId();
            throw new Exception("Lync thread not found!");
        }
        else
        {
            threadId = PInvoke.GetWindowThreadProcessId(hWnd, out processId);
        }

        //IntPtr module = PInvoke.GetModuleHandle(null);
        //IntPtr module = PInvoke.GetModuleHandle(GetType().Module.FullyQualifiedName);
        IntPtr module = PInvoke.GetModuleHandle("communicator.exe");
        int error = PInvoke.GetLastError();

        m_hhook = PInvoke.SetWindowsHookEx(
            m_hookType,
            m_filterFunc,
            //Process.GetCurrentProcess().Handle,
            //threadId);
            //IntPtr.Zero,
            //module,
            //Marshal.GetHINSTANCE(
            //                                System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]
            //                        ).ToInt32()
            module,
            threadId);

        //IntPtr hinst = Marshal.GetHINSTANCE(Process.GetCurrentProcess().Handle);

        // http://msdn.microsoft.com/en-us/library/ms681385
        // ERROR_HOOK_NEEDS_HMOD - 1428 = Cannot set nonlocal hook without a module handle
        error = PInvoke.GetLastError();
    }

Ответы [ 2 ]

4 голосов
/ 15 октября 2011

Вы не можете использовать GetModuleHandle для внешнего процесса.Это должен быть модуль, который был загружен в текущий процесс.

1 голос
/ 20 июня 2013

У меня была такая же проблема: 126 = Указанный модуль не найден.Я добавил недостающий цикл сообщений в свое приложение, и он снова начал работать.

Я использую функцию Hook следующим образом:

 hKeyboardHook = SetWindowsHookEx(
                    WH_KEYBOARD_LL,
                    KeyboardHookProcedure,
                    Marshal.GetHINSTANCE(typeof(your_class_type).Module),
                    0);

, и я добавил Application.Run() в конце MainFUNC

...