模拟键盘输入字符串的C++类

以下是类的声明:


//模拟输入字符串类

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
键盘输入在计算机编程中起着非常重要的作用,为了更好地处理键盘输入,面向对象编程和STL可以提供很多有用的工具和方法。 在面向对象编程中,可以定义一个Keyboard来处理键盘输入。这个可以包含一个方法来读取键盘的输入,并将其保存到一个字符串中。该方法可以利用输入流来读取键盘输入,并使用STL中的string来保存输入的内容。 另外,我们可以使用STL中的容器来存储键盘输入的多个字符。例如,使用vector来存储按键的顺序,每当用户按下一个键,就将其添加到vector中。通过这种方式,我们可以轻松地管理和处理所有的键盘输入。 除了存储按键的顺序外,我们还可以使用STL中的map来存储每个按键的状态。例如,使用map<char, bool>来保存每个按键是否被按下。当用户按下或释放一个键时,更新相应的按键状态。通过这种方式,我们可以方便地检查每个按键的当前状态。 另一个应用STL的例子是模拟键盘输入的延迟效果。我们可以使用STL中的chrono库来实现按键之间的延迟。通过设置适当的延迟时间,可以模拟真实键盘输入的速度和交互效果。 综上所述,通过面向对象编程和STL的应用,可以很方便地处理和模拟键盘输入。从读取键盘输入到存储按键顺序,再到检查按键状态,STL提供了各种有用的容器和方法供我们使用,使得键盘输入的处理更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值