立即注册

从零开始,编程论坛

广告联系qq1031180668喜欢网购的小伙伴们看过来啦
查看: 507|回复: 1

[c/c++] C/C++使用keybd_event模拟键盘按键

[复制链接]
  • ta_mind

    2019-8-30 13:16
  • classn_01: 73 classn_02

    [LV.6]常住居民II

    1054

    主题

    1776

    帖子

    3672

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3672

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-7-24 04:00:16 | 显示全部楼层 |阅读模式
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    #include <stdio.h>
    #include <Windows.h>
    
    /*
            设置键盘大小写状态
            big:为TRUE则切换大写状态,否则切换小写状态
    */
    VOID MySetKeyBig(BOOL big = FALSE);
    
    /*
            模拟键盘按键,支持大小写
            str:需要按出的字符串
    */
    VOID MyAnalogKey(char *str);
    
    int main(void)
    {
            // 当程序运行1.5s时再执行模拟按键,以便选择需要操作的窗口
            Sleep(1500);
            MyAnalogKey("Love life,Love BiaoGe.0123456789");
            system("pause");
            return 0;
    }
    
    VOID MySetKeyBig(BOOL big)
    {
            // 判断键盘CapsLock键是否开启状态,开启状态则为大写,否则为小写
            if (GetKeyState(VK_CAPITAL))
            {
                    // 如果当前键盘状态为大写,要求改小写,则模拟按键CapsLock切换状态
                    if (!big)
                    {
                            keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
            }
            else
            {
                    // 如果当前键盘状态为小写,要求改大写,则模拟按键CapsLock切换状态
                    if (big)
                    {
                            keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
            }
    }
    
    VOID MyAnalogKey(char *str)
    {
            int iLen = 0;
            char *tmp = NULL;
            INPUT *keys = NULL;
            BOOL bOldState = FALSE;
    
            // 保存此操作前的键盘状态
            bOldState = (BOOL)GetKeyState(VK_CAPITAL);
            iLen = lstrlen(str);
            tmp = (char *)malloc(iLen);
            memmove(tmp, str, iLen);
            for (int i = 0; i < iLen; i++)
            {
                    // 某些符号非直属键盘按键,这里只过滤转换两个,以后用到其它字符自行添加过滤
                    if (tmp[i] == ' ')
                    {
                            // 产生一个击键消息步骤:按下->抬起
                            keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
                    else if (tmp[i] == ',')
                    {
                            keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
                    else if (tmp[i] >= 'a' && tmp[i] <= 'z')
                    { // 根据字符大小写切换键盘大小写状态
                            MySetKeyBig(0);
                            // keybd_event只识别大写
                            keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
                    else if ((tmp[i] >= 'A' && tmp[i] <= 'Z') || (tmp[i] >= '0' && tmp[i] <= '9'))
                    {
                            MySetKeyBig(1);
                            keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
                    else
                    {
                            keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
                            keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
                    }
            }
            // 恢复此操作之前的键盘状态
            MySetKeyBig(bOldState);
            free(tmp);
    }

    C/C++使用keybd_event模拟键盘按键

     C/C++使用keybd_event模拟键盘按键


    不积跬步,无以至千里

    classn_11

    0

    主题

    42

    帖子

    88

    积分

    注册会员

    Rank: 2

    积分
    88
    发表于 2018-8-13 14:42:37 | 显示全部楼层
    回复

    使用道具 举报

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

    手机版|Archiver|小黑屋|sitemap| 从零开始,编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2019-10-16 15:15 , Processed in 1.097190 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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