C/C++ 屏蔽所有按键消息

本文介绍了一个用于拦截键盘消息的DLL Hook实现方法,该方法通过设置WH_KEYBOARD_LL类型的全局钩子来拦截并处理WM_KEYDOWN等消息,从而阻止这些消息传递到目标窗口程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

帮一个朋友写的这个小东西,要生成dll,有点小奇怪是要给java端来调用,主要就是个勾子来把消息截获了,就后程序程序就收不到了。关于这种勾子处理网上资料多的很。
生成hook 的dll代码

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

HHOOK g_HookHwnd = NULL;

// 钩子子程
LRESULT CALLBACK MyHookFun(int nCode, WPARAM wParam, LPARAM lParam)
{
    // 这个Structure包含了键盘的信息
    /*typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;*/
    // 我们只需要那个vkCode
    PKBDLLHOOKSTRUCT pVirKey = (PKBDLLHOOKSTRUCT)lParam;

    // MSDN说了,nCode < 0的时候别处理
    if (nCode >= 0)
    {
        // 按键消息
        switch (wParam)
        {
        case WM_KEYDOWN:
        case WM_SYSKEYDOWN:
        case WM_KEYUP:
        case WM_SYSKEYUP:
            switch (pVirKey->vkCode)
            {
            case VK_LWIN:
            case VK_RWIN:
                return 1;  // 吃掉消息
                break;
            }
            return 1;
            break;
        }
    }

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


HMODULE g_Module;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    {

        break;
    }
    }
    return TRUE;
}


extern "C" _declspec(dllexport) void FuncHookKey()
{
    if (!g_HookHwnd)
    {
        g_HookHwnd = SetWindowsHookEx(WH_KEYBOARD_LL, MyHookFun, g_Module, 0);
    }
}

extern "C" _declspec(dllexport) void FuncEndHook()
{
    UnhookWindowsHookEx(g_HookHwnd);
    g_HookHwnd = NULL;
}

然后就是来调用它了

typedef void (*FUNC_START)(); //FuncHookKey
typedef void (*FUNC_END)(); //FuncEndHook

HMODULE g_Dll;
FUNC_START func_start;
FUNC_END func_end;

g_Dll = LoadLibrary(L"Hook.dll");

func_start = (FUNC_START)GetProcAddress(g_Dll, "FuncHookKey");
func_end = (FUNC_END)GetProcAddress(g_Dll, "FuncEndHook");
//期间一直GetProAddress为空,吗的,注意生成dll的各种小细节,好了现在就可以拿着地址到处乱玩了~~

更多文章:https://blog.youkuaiyun.com/what951006
powered by:小乌龟在大乌龟背上~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值