实现检测系统按键和模拟系统按键

本文介绍了如何实现用户输入特定按键时自动触发一系列其他按键操作,类似于按键精灵的功能。该需求涉及到键盘输入检测和模拟键盘输入两部分,通过键盘钩子技术与模拟键盘按键的解决方案得以实现。

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

1.需求分析

一用户要求实现输入某个按键时,能接连触发多个其他按键,类似按键精灵那种,这里对用户的用途保密。这里牵涉到两个问题,1.检测键盘输入 2.模拟键盘输入

2.解决方案

采用键盘钩子和模拟键盘按键解决

3.代码部分

LPDWORD     g_lpdwVirtualKey = NULL;        // Keycode 数组的指针
int         g_nLength = 0;                  // Keycode 数组的大小
BOOL        g_bDisableKeyboard = FALSE;     // 是否屏蔽整个键盘
HINSTANCE   g_hInstance = NULL;             // 模块实例句柄
HHOOK       g_hHook = NULL;                 // 钩子句柄
HWND        g_hMainHwnd  = NULL;            //这个是传过来的窗口句柄
UINT        g_nCallbackMsg = 0;             //回调的消息

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;

        if (g_hMainHwnd != NULL && ((UINT)wParam == WM_KEYDOWN))
        {
            //IsVisible();
            //HWND hActiveWindow = GetActiveWindow();
            if (::IsWindowVisible(g_hMainHwnd))
            {
                LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
                for (int i = 0; i < g_nLength; i++)
                {
                    if (pStruct->vkCode == *tmpVirtualKey++)
                    {
                        //这里不返回还是要搞上去的
                        ::PostMessage(g_hMainHwnd, g_nCallbackMsg, wParam, pStruct->vkCode);
                        //return TRUE;
                    }
                }
            }
        }
    }

    // 传给系统中的下一个钩子
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

/********************************************************************/
/* 开始获取键盘按键消息                                               */
/*                                                                  */
/* 参数:                                                          */
/*          hWnd                    依赖窗口的句柄                 */
/*          nCallbackMsg            回调消息                        */
/*          lpdwVirtualKey          Keycode 数组的指针               */
/*          nLength                 Keycode 数组的大小               */
/*                                                                  */
/* 返回值: TRUE 成功, FALSE 失败                                   */
/********************************************************************/
BOOL StartMaskKey(HWND hWnd, UINT nCallbackMsg, LPDWORD lpdwVirtualKey, int nLength)
{
    // 如果已经安装键盘钩子则返回 FALSE
    if (g_hHook != NULL) return FALSE;

    // 将用户传来的 keycode 数组保存在全局变量中
    if (g_lpdwVirtualKey != NULL)
    {
        free(g_lpdwVirtualKey);
        g_lpdwVirtualKey = NULL;
    }

    g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
    LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
    for (int i = 0; i < nLength; i++)
    {
        *tmpVirtualKey++ = *lpdwVirtualKey++;
    }
    g_nLength = nLength;
    g_hMainHwnd = hWnd;
    g_nCallbackMsg = nCallbackMsg;

    // 安装底层键盘钩子
    g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
    if (g_hHook == NULL) return FALSE;
    return TRUE;
}

/********************************************************************/
/* 停止获取键盘消息                                                 */
/*                                                                  */
/* 参数:  (无)                                                 */
/*                                                                  */
/* 返回值: TRUE 成功, FALSE 失败                                   */
/********************************************************************/
BOOL StopMaskKey()
{
    // 卸载钩子
    if (UnhookWindowsHookEx(g_hHook) == 0) 
    {
        if (g_lpdwVirtualKey)
        {
            free(g_lpdwVirtualKey);
            g_lpdwVirtualKey = NULL;
        }
        return FALSE;
    }
    g_hHook = NULL;
    if (g_lpdwVirtualKey)
    {
        free(g_lpdwVirtualKey);
        g_lpdwVirtualKey = NULL;
    }
    return TRUE;
}

//模拟键盘按键
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值