Глобальный хук оболочки в приложении WPF - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь отловить событие создания / уничтожения указанного окна другого приложения.Для этого я установил WM_SHELLHOOK.

Вот упрощенный код из моего приложения WPF:

public delegate IntPtr ProcDelegate(int hookCode, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(
    int hookId, ProcDelegate handler, IntPtr hInstance, uint threadId);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);

private void buttonClick(object sender, RoutedEventArgs e)
{
    IntPtr hookHandler;

    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
        var moduleHandle = GetModuleHandle(curModule.ModuleName);
        hookHandler = SetWindowsHookEx(
            10 /*WH_SHELL*/, shellHookHandler, moduleHandle, 0);
    }

    if (hookHandler == IntPtr.Zero)
    {
        // Get here error 1428 (ERROR_HOOK_NEEDS_HMOD) -
        // "Cannot set nonlocal hook without a module handle."
        throw new Exception(Marshal.GetLastWin32Error().ToString());
    }
}

private IntPtr shellHookHandler(int hookCode, IntPtr wParam, IntPtr lParam)
{
    // Some code...
    return IntPtr.Zero;
}

Проблема в том, что SetWindowsHookEx всегда возвращает 0, а последняя ошибка

1428 (ERROR_HOOK_NEEDS_HMOD) Невозможно установить нелокальный хук без дескриптора модуля.

Я посмотрел другие связанные вопросы.Когда я устанавливаю ловушку для мыши, клавиатуры и т. Д. - все в порядке.

Пожалуйста, укажите мне, как исправить эту ошибку.Спасибо.

1 Ответ

1 голос
/ 29 января 2012

Документация MSDN для ловушек говорит: «Если приложение устанавливает подключаемую процедуру для потока другого приложения, процедура должна быть в DLL.»

Это потому, что вашаDLL загружается в адресное пространство другого приложения;Затем вам нужно найти какой-то механизм (например, файл с отображением в памяти) для передачи информации в ваше основное приложение.

Однако, в отличие от большей части документации (здесь упоминается ),крючки для клавиатуры и мыши работают без DLL.Вот почему они работали на вас.

...