天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 5847|回复: 0

SendInput代替了keybd_event按键支持发送中文

[复制链接]

9

主题

1

回帖

12

积分

编程入门

Rank: 1

天马币
18
发表于 2024-3-2 09:55:08 | 显示全部楼层 |阅读模式
SendInput比keybd_event要方便多了,可以支持发送中文。

#include <atlconv.h>   
  
#pragma comment(lib,"User32.lib")  
#pragma comment(lib,"shlwapi.lib")  
  
void SendAscii(wchar_t data, BOOL shift)  
{  
    INPUT input[2];  
    memset(input, 0, 2 * sizeof(INPUT));  
  
    if (shift)  
    {  
        input[0].type = INPUT_KEYBOARD;  
        input[0].ki.wVk = VK_SHIFT;  
        SendInput(1, input, sizeof(INPUT));  
    }  
  
    input[0].type = INPUT_KEYBOARD;  
    input[0].ki.wVk = data;  
  
    input[1].type = INPUT_KEYBOARD;  
    input[1].ki.wVk = data;  
    input[1].ki.dwFlags = KEYEVENTF_KEYUP;  
  
    SendInput(2, input, sizeof(INPUT));  
  
    if (shift)  
    {  
        input[0].type = INPUT_KEYBOARD;  
        input[0].ki.wVk = VK_SHIFT;  
        input[0].ki.dwFlags = KEYEVENTF_KEYUP;  
        SendInput(1, input, sizeof(INPUT));   
    }  
}  
  
  
void SendUnicode(wchar_t data)  
{  
    INPUT input[2];  
    memset(input, 0, 2 * sizeof(INPUT));  
  
    input[0].type = INPUT_KEYBOARD;  
    input[0].ki.wVk = 0;  
    input[0].ki.wScan = data;  
    input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE;  
  
    input[1].type = INPUT_KEYBOARD;  
    input[1].ki.wVk = 0;  
    input[1].ki.wScan = data;  
    input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE;  
  
    SendInput(2, input, sizeof(INPUT));  
}  
  
//为方便使用,下面这个函数包装了前两个函数。  
void SendKeys(TCHAR *strMsg)  
{  
    short vk;  
    BOOL shift;  
  
    USES_CONVERSION;  
    wchar_t* data = T2W(strMsg);  
    int len = wcslen(data);  
  
    for(int i=0;i<len;i++)  
    {  
        if (data[i]>=0 && data[i]<256) //ascii字符  
        {  
            vk = VkKeyScanW(data[i]);  
  
            if (vk == -1)  
            {  
                SendUnicode(data[i]);  
            }  
            else  
            {  
                if (vk < 0)  
                {  
                    vk = ~vk + 0x1;  
                }  
  
                shift = vk >> 8 & 0x1;  
  
                if (GetKeyState(VK_CAPITAL) & 0x1)  
                {  
                    if (data[i]>='a' && data[i]<='z' || data[i]>='A' && data[i]<='Z')  
                    {  
                        shift = !shift;  
                    }  
                }  
  
                SendAscii(vk & 0xFF, shift);  
            }  
        }  
        else //unicode字符  
        {  
            SendUnicode(data[i]);  
        }  
    }  
}  

int _tmain(int argc, _TCHAR* argv[])  
{  
  
    Sleep(5000);  
    SendKeys(L"Sysprogram 测试中文");  
  
    return 0;  
}  
回复

使用道具 举报

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

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表