【问题标题】:How to block printing functionality(CTRL + P) on windows text editors?如何在 Windows 文本编辑器上阻止打印功能(CTRL + P)?
【发布时间】:2019-07-15 12:31:11
【问题描述】:

我想在特定应用程序的 Windows 平台上阻止打印功能 (CTRL + P)。我正在使用键盘钩子来做这件事。我能够检测到 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;

}

【问题讨论】:

  • 这真的感觉像是问题的错误解决方案,不管问题实际上是什么!
  • 如果您不希望人们从他们的计算机上打印,请不要让他们的应用程序在那里运行。因为无论你做什么,他们都可以撤消。在此过程中,您会惹恼您的客户。因为你猜怎么着?如果它显示在他们的屏幕上,他们可以总是打印它。
  • 我已回滚您的编辑。如果您想添加您找到的解决方案,请以答案的形式将其写下来,并将其张贴在下面用于此目的的空间中。请参阅Can I answer my own question? 了解更多信息。将解决方案编辑到问题本身是不合适的。

标签: c winapi dll-injection


【解决方案1】:

我想在 Windows 平台上阻止打印功能(CTRL + P) 用于特定应用。我正在使用键盘钩子来做这件事。我是 能够检测到 CTRL + P 但我无法阻止它。

这会在 WH_KEYBOARD_LL 钩子中阻止 [Ctrl] + "P"...但不会阻止通过 [File] [Print] 或其他方式打印... =>

    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);
    }

【讨论】:

  • Windows 应用程序使用 WH_KEYBORAD_LL 挂钩来阻止 CTRL + P。更新了有问题的解决方案。谢谢 Castorix
【解决方案2】:

使用 WH_KEYBORAD_LL 挂钩阻止 CTRL + P 的 Windows 应用程序有效。所以工作代码sn-p如下:

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多