本人以前开发模拟鼠标和键盘在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]);
}
}
}