как установить крючок без петли - PullRequest
0 голосов
/ 07 октября 2018

Я написал эту динамическую библиотеку для установки ловушки, но для правильной работы ловушки программа требует, чтобы она была в цикле while.Есть ли способ, которым я мог бы установить хук без использования цикла while и иметь возможность удалить его аналогично моему методу «unlock», показанному ниже?Позже библиотека будет использоваться в программе на C #, и ее цель - блокировать любые буквы, поступающие с клавиатуры, и пропускать только цифры.Спасибо

#pragma once
#include "Header.h"
#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <fstream>
#include <ShlObj.h>


#define _WIN32_WINNT 0x050
HHOOK hhkLowLevelKybd = NULL;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    BOOL duckx = FALSE;
    BOOL ducky = FALSE;

    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case WM_KEYDOWN:
        case WM_SYSKEYDOWN:
        case WM_KEYUP:
        case WM_SYSKEYUP:
            PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
            if ((duckx = (p->vkCode >= 0x3a)) || (duckx = (p->vkCode <= 0x28 && p->vkCode > 0x08))) {

                break;
            }
            break;
        }
    }
    return(duckx ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

void lock() {

    HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);

}
void unlock() {

    UnhookWindowsHookEx(hhkLowLevelKybd);

}
myClass::myClass(int x) {
    if (x == 1) {

        lock();
        MSG msg;
        while (!GetMessage(&msg, NULL, NULL, NULL)) {
            TranslateMessage(&msg);

            DispatchMessage(&msg);
        }
    }
    if (x == 0) {

        unlock();
        MSG msg;
        while (!GetMessage(&msg, NULL, NULL, NULL)) {
            TranslateMessage(&msg);

            DispatchMessage(&msg);
        }
    }


}

1 Ответ

0 голосов
/ 07 октября 2018

Многие из хуков, предоставляемых SetWindowsHookEx(), требуют, чтобы у потока установки был цикл сообщений, поскольку их обратные вызовы хуков передаются обратно этому потоку при вызове, и это требует синхронизации, которую может обработать цикл сообщений.

Прочитайте документацию SetWindowsHookEx(), в которой конкретно указано, для каких перехватчиков требуется цикл обработки сообщений.

Подсказка - WH_KEYBOARD_LL является одним из них:

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

Поскольку вы пишете библиотеку, вы не можете гарантировать, что в вызывающем приложении есть цикл сообщений.Итак, вы должны заставить свою библиотеку запускать свой собственный рабочий поток, который имеет цикл обработки сообщений.Этот поток может (не) устанавливать ловушку и обрабатывать обратные вызовы.Пусть lock() создаст этот поток, а unlock() остановит его.

...