C++ 在Windows光标处添加文本
2021/11/5 7:13:29
本文主要是介绍C++ 在Windows光标处添加文本,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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())); }
如果本文对你有帮助,可以资助一下作者。
-----------------------------------------------------------------微信------------------------------------------------------------------
-----------------------------------------------------------------支付宝---------------------------------------------------------------
这篇关于C++ 在Windows光标处添加文本的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升