以下是类的声明:
//模拟输入字符串类
class StringInputer
{
//用于分隔相邻相同字符的按键动作的个数
enum {NUM_PART_ACTION = 4};
private:
//存储待发送的字符串
CString m_strData;
//用于分割相邻相同字符的按键动作
INPUT m_aInputPart[NUM_PART_ACTION];
//检查有多少相邻相同的字符
INT CheckAlikeChar();
public:
//构造函数
StringInputer();
StringInputer(const CString &strData);
StringInputer& operator = (const CString &strData);
//模拟输入
INT Input();
};
------------------------------------------------------------我是淫荡的分割线----------------------------------------------------------
以下是类的定义:
//StringInputer类定义
//默认构造函数
StringInputer::StringInputer()
{
//初始化用于分割相邻相同字符的按键动作结构
KEYBDINPUT aKeyInput[NUM_PART_ACTION] = {0};
aKeyInput[0].wVk = VK_LEFT;
aKeyInput[1].wVk = VK_LEFT;
aKeyInput[1].dwFlags = KEYEVENTF_KEYUP;
aKeyInput[2].wVk = VK_RIGHT;
aKeyInput[3].wVk = VK_RIGHT;
aKeyInput[3].dwFlags = KEYEVENTF_KEYUP;
for (int i=0;i<NUM_PART_ACTION;i++)
{
m_aInputPart[i].type = INPUT_KEYBOARD;
m_aInputPart[i].ki = aKeyInput[i];
}
}
//构造函数初始化字符串数据
StringInputer::StringInputer(const CString &strData)
{
//初始化用于分割相邻相同字符的按键动作结构
KEYBDINPUT aKeyInput[NUM_PART_ACTION] = {0};
aKeyInput[0].wVk = VK_LEFT;
aKeyInput[1].wVk = VK_LEFT;
aKeyInput[1].dwFlags = KEYEVENTF_KEYUP;
aKeyInput[2].wVk = VK_RIGHT;
aKeyInput[3].wVk = VK_RIGHT;
aKeyInput[3].dwFlags = KEYEVENTF_KEYUP;
for (int i=0;i<NUM_PART_ACTION;i++)
{
m_aInputPart[i].type = INPUT_KEYBOARD;
m_aInputPart[i].ki = aKeyInput[i];
}
m_strData = strData;
}
//赋值构造
StringInputer& StringInputer::operator = (const CString &strData)
{
m_strData = strData;
return *this;
}
//检查有多少相邻相同的字符
INT StringInputer::CheckAlikeChar()
{
ASSERT(!m_strData.IsEmpty());
CHAR ch = m_strData[0];
INT nAlikeChar = 0;
for (int i=1;i<m_strData.GetLength();i++)
{
if (m_strData[i] == ch)
{//出现相邻的相同字符
nAlikeChar++;
}
ch = m_strData[i];
}
return nAlikeChar;
}
//模拟输入
INT StringInputer::Input()
{
ASSERT(!m_strData.IsEmpty());
//有多少个分隔动作
INT nPartAction = NUM_PART_ACTION*CheckAlikeChar();
//需要多少个字符模拟动作
INT nCharAction = m_strData.GetLength();
//总共需要多少个模拟动作
INT nTotalAction = nCharAction + nPartAction;
//创建KEYBDINPUT结构
PKEYBDINPUT pKeyInput = new KEYBDINPUT[nCharAction];
for (int i=0;i<nCharAction;i++)
{
pKeyInput[i].wVk = NULL;
pKeyInput[i].wScan = (WORD)m_strData[i];
pKeyInput[i].dwFlags = KEYEVENTF_UNICODE;
pKeyInput[i].time = 0;
pKeyInput[i].dwExtraInfo = NULL;
}
//创建INPUT结构
PINPUT pInput = new INPUT[nTotalAction];
CHAR ch = m_strData[0];
//先填充第一个字符模拟动作
pInput[0].type = INPUT_KEYBOARD;
pInput[0].ki = pKeyInput[0];
//从第二个开始循环处理,i为INPUT结构下标,n为字符串下标
for (int i=1,n=1;i<nTotalAction;i++,n++)
{
if (m_strData[n] == ch)
{//出现相邻相同字符,添加分隔动作
for (int k=0;k<NUM_PART_ACTION;k++,i++)
{
pInput[i] = m_aInputPart[k];
}
}
ch = m_strData[n];
//正常添加字符模拟动作
pInput[i].type = INPUT_KEYBOARD;
pInput[i].ki = pKeyInput[n];
}
//发送模拟按键
INT nBeSend = ::SendInput(nTotalAction,pInput,sizeof(*pInput));
delete []pKeyInput;
delete []pInput;
if (nBeSend>0)
//发送成功
return nCharAction;
else
//发送失败
return -1;
}
------------------------------------------------------------我是淫荡的分割线----------------------------------------------------------
用法:
StringInputer inputer("Hello!");
inputer.Input();
模拟键盘输入字符串的C++类
最新推荐文章于 2024-06-27 20:14:39 发布