C++ 在Windows光标处添加文本
最近在做一个往系统光标处设置文本的需求,在网上搜寻了很多资料也没有找到,最后硬啃Windows API文档实现了,关键代码放在这里,以供参考.
在光标处设置文本
首先,先把这些头文件包进去
#include<Textstor.h>
#include<string>
#include<locale>
#include<codecvt>
#include<tchar.h>
#include<iostream>
#include<cstring>
using namespace std;
然后使用下面的代码,就可以在系统任意窗口中的光标闪烁处设置文本了
//在系统光标处设置文本
HWND hwnd = ::GetForegroundWindow();
string text="中文测试代码";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
wstring tst=converter.from_bytes(text);
const wchar_t *final_text=tst.data();
for(int i=0;final_text[i]!='\0';i++)
{
SendMessage(hwnd, WM_CHAR,final_text[i], 0);
}
处理中文乱码
上面代码中,这三行
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
wstring tst=converter.from_bytes(text);
const wchar_t *final_text=tst.data();
是将string转为wchar_t*,这样输出的中文不会是乱码,如果不需要输出中文,可以直接使用下面的方式
const string final_text="This is a English text";
for(auto i:final_text)
SendMessage(hwnd, WM_CHAR,i, 0);
模拟按键
因为SendInput与SendMessage比较类似,在这里放出模拟按键的代码:
模拟单个按键
INPUT inputs[2] = {}; //1个按键对应2大小,这里模拟按下'd'
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD; //声明为按键事件,也可以声明为鼠标事件模拟鼠标左右键
inputs[0].ki.wVk = 'D';
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'D';
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;//不是很明白这句话的意思,照官方例子抄的,应该是设置触发方式
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
if (uSent != ARRAYSIZE(inputs))
{
//这里是处理异常的地方,也可以不需要
// OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
模拟按下组合键ctrl+s
INPUT inputs[4] = {};
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;//所有按键对应的宏可以进入声明处查看
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'S';
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = VK_CONTROL;
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = 'S';
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
if (uSent != ARRAYSIZE(inputs))
{
// OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
如果本文对你有帮助,可以资助一下作者。
-----------------------------------------------------------------微信------------------------------------------------------------------
-----------------------------------------------------------------支付宝---------------------------------------------------------------