简介:使用C语言编写的一个模拟键盘输入文本的程序以解决文字无法直接粘贴问题。
(不能保证对所有窗口都有效)
编译生成的exe程序下载:
阿里云盘 百度网盘
使用说明:先复制需要粘贴的文本内容,然后打开程序(先打开程序再复制文本也可)。按下CTRL键不放然后在要粘贴的文本框点击鼠标左键即可开始工作,运行完成后程序会自动退出。粘贴过程可以按ESC键中断并会自动退出。
本程序对于换行符是使用回车键处理的,请不要在回车键不是换行的窗口使用。例如聊天窗口等。
参考文章:
1.剪切板问题:
C语言操作剪切板内容!win32程序_普通网友的博客-CSDN博客_c语言获取剪切板内容
2.输入框窗口句柄获取问题:
获取Windows应用程序当前焦点控件的句柄_mkelehk的博客-CSDN博客
C语言源码:
注意:请使用Visual Studio编译防止乱码!(我用的是最新版)。
#include <windows.h>
#include <stdio.h>
int main()
{
DWORD CurrenThreadId;
DWORD WindowThreadId;
HGLOBAL hGlobal = NULL;
HWND hWnd = NULL;
wchar_t* buf = NULL;
//更改CMD窗口大小
system("mode con cols=60 lines=25");
printf("按住ctrl键不放然后在文本框点击鼠标左键以开始,ESC键结束!\n");
//等待组合键按下
while (GetKeyState(VK_CONTROL) >= 0 || GetKeyState(VK_LBUTTON) >= 0)
Sleep(50);
//确保鼠标左键已经弹起,否则影响文本输入
while (GetKeyState(VK_LBUTTON) < 0)
Sleep(50);
//等待文本框窗口被激活以便正确获取窗口句柄
Sleep(500);
//获取输入框的窗口句柄
hWnd = GetForegroundWindow();
CurrenThreadId = GetCurrentThreadId();
WindowThreadId = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(WindowThreadId, CurrenThreadId, 1);
hWnd = GetFocus();
AttachThreadInput(WindowThreadId, CurrenThreadId, 0);
if (hWnd == NULL)
{
system("cls");
printf("输入框句柄获取失败,对此窗口无效!即将退出!");
Sleep(2000);
return -1;
}
//打开剪切板
if (!OpenClipboard(NULL))
{
system("cls");
printf("剪切板打开失败,请重试!\n");
Sleep(2000);
return -1;
}
//确保剪切板内容为文本
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
{
system("cls");
printf("剪切板内容非文本!请重试。即将自动退出\n");
CloseClipboard();
Sleep(2000);
return -1;
}
//获取剪切板文本字符串存放首地址
hGlobal = GetClipboardData(CF_UNICODETEXT);
buf = (wchar_t*)GlobalLock(hGlobal);
GlobalUnlock(hGlobal);
system("cls");
printf("正在运行!\n");
//向输入框输入剪切板内容
int i = 0;
while (1)
{
//跳过文本中出现的回车符'\r'以及其后的换行符'\n'
//并向窗口发送回车键代替换行
while (*(buf + i) == '\r')
{
//输出换行
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
i += 2;
Sleep(20);
}
//判断是否为字符串结尾
if (*(buf + i) == '\0')
break;
//向文本框发送剪切板文本
PostMessage(hWnd, WM_CHAR, *(buf + i), 0);
i++;
//检测到ESC键按下退出
if (GetKeyState(VK_ESCAPE) < 0)
{
system("cls");
printf("已暂停,请重新打开软件使用。即将自动退出!");
CloseClipboard();
Sleep(2000);
return 0;
}
Sleep(20);
}
system("cls");
printf("已完成!即将自动退出!\n");
//关闭剪切板
CloseClipboard();
Sleep(2000);
return 0;
}