系统相关
首页 > 系统相关> > C++ 在Windows光标处添加文本

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

如果本文对你有帮助,可以资助一下作者。
-----------------------------------------------------------------微信------------------------------------------------------------------
在这里插入图片描述
-----------------------------------------------------------------支付宝---------------------------------------------------------------

在这里插入图片描述

标签:inputs,Windows,text,ki,C++,INPUT,include,光标
来源: https://blog.csdn.net/cosmicdemon/article/details/121135652