Что делает GetModuleHandle () в этом коде? - PullRequest
1 голос
/ 14 июля 2009

Отредактированный ........

извините, сэр, я ссылался на этот фрагмент кода из статьи Стивена Туба.

<code>
    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

Может кто-нибудь объяснить мне это вкратце ... ??

Ответы [ 3 ]

2 голосов
/ 14 июля 2009

Короче говоря, этот код инициализирует регистратор ключей. Переданный в параметре, proc, является функцией обратного вызова, которая будет вызываться при каждом нажатии клавиши.

Оператор using просто обеспечивает немедленные вызовы dispose () для объявленных переменных (curProcess и curModule), когда они выходят из области видимости, таким образом, правильно освобождая ресурсы удобным способом, а не ожидая, пока сборщик мусора освободит их, что может занять в то время.

SetWindowsHookEx - это API-вызов win32, который позволяет зарегистрировать обратный вызов, который будет вызываться при возникновении определенного события уровня ОС. В этом случае первый параметр, WH_KEYBOARD_LL, указывает, что вы хотите зарегистрироваться для низкоуровневых событий клавиатуры. Второй параметр - это обратный вызов (делегат в .Net), который будет вызван. Третий параметр - это дескриптор окна (указатель, управляемый ОС) для модуля, в котором находится обратный вызов, в данном случае основной .exe для процесса. Обратите внимание, что процесс имеет несколько модулей (exe или dll), загруженных в любой момент времени. Последний параметр - это идентификатор потока, который вы хотите отслеживать; поскольку передается 0, обратный вызов будет вызываться для любых ключевых событий для любого окна, открытого в ОС.

Подробнее здесь о SetWindowsHookEx

0 голосов
/ 14 июля 2009

Во-первых, в качестве общего пункта для вопросов о функциях библиотеки Windows, вы должны рассмотреть поиск MSDN . Здесь - это страница MSDN для GetModuleHandle (), она содержит значительную часть соответствующей информации.

К вашему вопросу (и любой, кто более знаком с Windows API, не стесняйтесь меня поправлять), «модуль» - это своего рода термин для всей программы, обычно относящийся либо к исполняемому файлу (.exe). ) или библиотека (.dll). «Дескриптор» - это термин, относящийся к указателю. GetModuleHandle () возвращает указатель (дескриптор) на конкретную программу (модуль). Как прокомментировал Павел, оба являются очень широкими терминами.

Что касается размещенного вами фрагмента кода:

Он получает текущий запущенный процесс, а также текущий модуль (очевидно). Затем он вызывает SetWindowsHookEx (обратитесь к MSDN за дополнительной информацией), который принимает событие для перехвата (в данном случае, события низкоуровневой клавиатуры.), Процедуру для вызова (proc), когда происходит перехваченное событие, и указатель на текущая программа.

См. Hooks на MSDN для получения дополнительной информации о подключении.

По сути, сообщение этого поста состоит в том, чтобы больше использовать MSDN, это довольно солидная часть документации:)

0 голосов
/ 14 июля 2009

GetModuleHandle() - это Windows API, который простым словом возвращает вам дескриптор загруженной DLL или EXE.

Подробное описание этого API можно посмотреть на этой ссылке

Прямо с MSDN:

Функция GetModuleHandle возвращает дескриптор сопоставленного модуля без увеличения его счетчика ссылок. Поэтому будьте внимательны при передаче дескриптора в функцию FreeLibrary, поскольку это может привести к преждевременному отключению модуля DLL.

Эта функция должна использоваться осторожно в многопоточном приложении. Нет гарантии, что дескриптор модуля остается действительным между временем, когда эта функция возвращает дескриптор, и временем, когда он используется. Например, поток извлекает дескриптор модуля, но прежде чем он использует дескриптор, второй поток освобождает модуль. Если система загружает другой модуль, она может повторно использовать дескриптор модуля, который был недавно освобожден. Следовательно, первый поток будет иметь дескриптор модуля, отличный от того, который предназначен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...