Windows键盘钩子

Runtime:VS2013

#include "stdafx.h"
#include <windows.h>
#include <conio.h>

DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;

bool CALLBACK con_handler(DWORD CtrlType)
{
    PostThreadMessage(g_main_tid, WM_QUIT, 0, 0);
    return TRUE;
};

LRESULT CALLBACK kb_proc(int code, WPARAM w, LPARAM l)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
    const char *info = NULL;
    if (w == WM_KEYDOWN)
        info = "key dn";
    else if (w == WM_KEYUP)
        info = "key up";
    else if (w == WM_SYSKEYDOWN)
        info = "sys key dn";
    else if (w == WM_SYSKEYUP)
        info = "sys key up";
    printf("%s - vkCode [%04x], scanCode [%04x]\n",
        info, p->vkCode, p->scanCode);
    // always call next hook
    return CallNextHookEx(g_kb_hook, code, w, l);
};

DWORD WINAPI KbHookThread(LPVOID lpParam)
{
    g_main_tid = GetCurrentThreadId();

    //register Ctrl+C callback
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)&con_handler, TRUE);
    g_kb_hook = SetWindowsHookEx(WH_KEYBOARD_LL, //Installs a hook procedure that monitors low-level keyboard input events
        (HOOKPROC)&kb_proc, //A hook procedure that monitors low-level keyboard input events
        NULL,//A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.(GetModuleHandle(NULL))
        0);//The identifier of the thread with which the hook procedure is to be associated. For desktop apps, if this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. For Windows Store apps, see the Remarks section.
    if (g_kb_hook == NULL) {
        printf("SetWindowsHookEx failed, %ld\n", GetLastError());
        return 0;
    }

    // Message loop
    MSG msg;
    

    //If GetMessage retrieves the WM_QUIT message, the return value is zero.
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    //exit the thread
    UnhookWindowsHookEx(g_kb_hook);
    return 0;
};

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE h = CreateThread(NULL, 0, KbHookThread, NULL, 0, NULL);
    if (NULL == h) {
        printf("CreateThread failed, %ld\n", GetLastError());
        return -1;
    }

    //wait thread to exit
    WaitForMultipleObjects(1, &h, TRUE, INFINITE);

    return 0;
}

 

转载于:https://www.cnblogs.com/LubinLew/p/Windows-Hook-Keyboard.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值