优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++ 在IE界面下模拟键盘输入中文汉字、数字、英文字符

nanyue 2024-08-31 23:55:00 技术文章 10 ℃

本人以前开发模拟鼠标和键盘在IE界面上自动填写的项目,发现采用老办法(模拟输入英文字符和数字没问题)模拟输入中文字符后确实在单元格写入了,

但是点击保存刷新后,IE单元格中并没有写入,至于为啥没有搞清楚,于是就从网上百度看看有没有比较好的转换方式,发现一篇比较好的方法, 自己稍微改了一下,请各位大神看看是否有不妥的地方多指教,共同进步。同时,希望需要用到的同仁可以看一下是否自己也需要。

/*************************************************

Function: // SendAscii

Description: // 将字符转换为Ascii编码,模拟键盘输入汉字

Input: // data 宽字符

Input: // shift 是否按下SHIFI键,进行中文输入

Output: // null

Return: // null

*************************************************/

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));

}

}

/*************************************************

Function: // SendUnicode

Description: // 将字符转换为UNICODE编码,模拟键盘输入

Input: // ascii字符

Output: // null

Return: // null

*************************************************/

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));

}

/*************************************************

Function: // SendKeys

Description: // 获取要模拟键盘输入的字符

Input: // 输入的字符串

Output: // null

Return: // null

*************************************************/

void SendKeys(CString msg)

{

short vk;

BOOL shift;

USES_CONVERSION;

wchar_t* data = T2W(msg.GetBuffer(0));//转换为宽字节

int len = wcslen(data);

for(int i=0;i<len;i++)

{

if (data[i]>=0 && data[i]<256) //ascii字符

{

vk = VkKeyScanW(data[i]);//将字符翻译成相应的虚拟键码和当前键盘对应的转换状态

//如果等于-1,代表不是特殊建码

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]);

}

}

}

Tags:

最近发表
标签列表