消息钩子

// 01 消息钩子截获按键信息.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"..\01 消息钩子dll\消息钩子dll.h"
#pragma  comment(lib,"..\\Debug\\01 消息钩子dll.lib")


int _tmain(int argc, _TCHAR* argv[])
{
    InstallHook();
    system("pause");
    UnstallHook();
    return 0;
}
// 01 消息钩子dll.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "消息钩子dll.h"

HHOOK  g_Hook = 0;
LRESULT CALLBACK KeyboardProc(
    int code,           // 消息类型
    WPARAM wParam,      // 虚拟码
    LPARAM lParam) {      // 按键信息
    // 判断是否wParam与lParam都有键盘消息,是的话则执行打印操作
    if (code == HC_ACTION){
        // 将256个虚拟键的状态拷贝到指定的缓冲区中,如果成功则继续
        BYTE KeyState[256] = { 0 };
        if (GetKeyboardState(KeyState)) {
            // 得到第16–23位,键盘虚拟码
            LONG  KeyInfo = lParam;
            UINT  keyCode = (KeyInfo >> 16) & 0x00ff;
            WCHAR wKeyCode = 0;
            ToAscii((UINT)wParam, keyCode, KeyState, (LPWORD)&wKeyCode, 0);
            // 将其打印出来
            WCHAR szInfo[512] = { 0 };

            swprintf_s(szInfo, _countof(szInfo), L"Hook%c", (char)wKeyCode);

            OutputDebugString(szInfo);
            return 0;
        }
    }

    return CallNextHookEx(g_Hook, code, wParam, lParam);
}

extern "C" _declspec(dllexport)  BOOL    InstallHook()
{
    if (g_Hook == 0)
    {
        g_Hook =
            SetWindowsHookEx(WH_KEYBOARD,
            KeyboardProc,
            GetModuleHandleA("01 消息钩子dll.dll"),
            0);
        return TRUE;
    }
    return FALSE;
}

extern "C" _declspec(dllexport) BOOL UnstallHook()
{
    if (g_Hook != 0)
    {
        UnhookWindowsHookEx(g_Hook);
        g_Hook = 0;
        return TRUE;
    }
    return FALSE;
}

 

posted @ 2016-03-31 19:15  天还是那么蓝  阅读(221)  评论(0编辑  收藏  举报