Как заблокировать функции печати (CTRL + P) в текстовых редакторах Windows? - PullRequest
2 голосов
/ 10 июля 2019

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

LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(
    int nCode,
    WPARAM wParam,
    LPARAM lParam)
{
    FILE* f1;
    static WPARAM wPrevParam;

    if (((DWORD)lParam & 0x40000000) && (HC_ACTION == nCode))
    {
        if ((wParam == VK_SPACE) || (wParam == VK_RETURN) || (wParam == VK_CONTROL) || (wParam >= 0x2f) && (wParam <= 0x100))
        {
            char ch;
            f1 = fopen("d:\\report.txt", "a+");
            if (wParam == VK_CONTROL)
            {
                if (wPrevParam == 0x50)// 0x50 = P
                {
                    const char* text = "CTRL-P detected.";
                    fwrite(text, strlen(text), 1, f1);
                    fclose(f1);
                    wParam = 0;
                    lParam = 0;
                    return 1;
                }

                const char *text = "CTRL";
                fwrite(text, strlen(text), 1, f1);
                fprintf(f1, "%02X\n", (unsigned char)wParam);
            }
            else
            {
                wPrevParam = wParam;
            }

            fclose(f1);
        }

    }

    LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam);

    return  RetVal;

}

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Я хочу заблокировать функции печати (CTRL + P) на платформе Windows для конкретных приложений.Я делаю это, используя клавиатуруЯ могу обнаружить CTRL + P, но не могу остановить его.

Это блокирует [Ctrl] + "P" в WH_KEYBOARD_LL крюке ... но выигралпредотвратить печать с помощью [Файл] [Печать] или другим способом ... =>

    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        DWORD dwKey = 0;
        if (HC_ACTION == nCode)
        {
            KBDLLHOOKSTRUCT *pkbdll = (KBDLLHOOKSTRUCT*)lParam;
            dwKey = pkbdll->vkCode;
            BOOL bCtlDown = GetKeyState(VK_CONTROL) < 0;
            if (bCtlDown && dwKey == 'P')
            {           
                Beep(6000, 10);
                return 1;
            }
        }
        return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
    }
0 голосов
/ 15 июля 2019

Работает приложение Windows для блокировки CTRL + P с помощью хука WH_KEYBORAD_LL. Поэтому рабочий фрагмент кода будет выглядеть следующим образом:

#include<fstream>
#include<windows.h>

using namespace std;

ofstream out("logs.txt", ios::out);

LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    static bool controlPressed = false;
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)(lParam);

    if (wParam == WM_KEYDOWN)
    {
        if (p->vkCode == VK_LCONTROL || p->vkCode == VK_RCONTROL)
        {
            controlPressed = true;
        }
        else if (char(tolower(p->vkCode)) == 'p' && true == controlPressed)
        {
            out << "<CONTROL + P Detected>";
                return 1;
        }
        else
        {
            controlPressed = false;
        }

    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
        keyboardHookProc,
        hInstance,
        0
    );

    MessageBox(NULL, TEXT("Press OK to stop blocking of printing."), TEXT("Information"), MB_OK);
    out.close();
    return 0;
}
...