找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 380|回复: 0

昭姐每天一练- C++全局键盘Hook源码

[复制链接]

30

主题

1

回帖

0

积分

版主

积分
0
发表于 2013-6-8 10:52:42 | 显示全部楼层 |阅读模式



#include <windows.h>
#include "keyboard.h"
#include "stdio.h"

#define _WIN32_WINNT 0x0501

HINSTANCE    hDllInst    = NULL ;    // DLL模块实例句柄

int WINAPI DllMain ( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )
{
    if ( fdwReason == DLL_PROCESS_ATTACH )
        hDllInst = hInstance ;        // 保存DLL实例句柄
    return true ;
}

// 键盘钩子消息处理过程
LRESULT CALLBACK KeyboardProc ( int nCode, WPARAM wParam, LPARAM lParam )
{
    // 最高位为0(lParam>0),表示VM_KEYDOWN消息
    if( ( nCode == HC_ACTION ) && ( lParam > 0 ) )
    {
        WCHAR KeyName[10] = {0} ;
        GetKeyNameText ( (LONG)lParam, KeyName, 50 ) ;
        MessageBox ( NULL, KeyName, L"全局键盘钩子", MB_OK ) ;
    }

    // 继续传递消息
    return CallNextHookEx ( hKeyboard, nCode, wParam, lParam ) ;
}

// 钩子控制函数,能够启动/卸载钩子
BOOL WINAPI SetHook ( BOOL isInstall )
{
    // 需要安装,且键盘钩子不存在
    if ( isInstall && !hKeyboard )
    {
        // 设置全局钩子
        hKeyboard = SetWindowsHookEx ( WH_KEYBOARD, (HOOKPROC)KeyboardProc, hDllInst, 0 ) ;
        if ( hKeyboard == NULL )
        {
            DWORD dwErrorCode = GetLastError () ;
            return FALSE ;
        }
    }

    // 需要卸载,且键盘钩子存在
    if ( !isInstall && hKeyboard )
    {
        // 卸载钩子
        BOOL ret = UnhookWindowsHookEx ( hKeyboard ) ;
        hKeyboard    = NULL ;
        return ret ;
    }

    return TRUE ;
}
[attachment=49]

   
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:43 , Processed in 0.101316 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表