解决文本框无法粘贴问题(C语言)

简介:使用C语言编写的一个模拟键盘输入文本的程序以解决文字无法直接粘贴问题。

(不能保证对所有窗口都有效)

编译生成的exe程序下载:

阿里云盘  百度网盘

使用说明:先复制需要粘贴的文本内容,然后打开程序(先打开程序再复制文本也可)。按下CTRL键不放然后在要粘贴的文本框点击鼠标左键即可开始工作,运行完成后程序会自动退出。粘贴过程可以按ESC键中断并会自动退出。 

本程序对于换行符是使用回车键处理的,请不要在回车键不是换行的窗口使用。例如聊天窗口等。

参考文章:

1.剪切板问题:

C语言操作剪切板内容!win32程序_普通网友的博客-CSDN博客_c语言获取剪切板内容

C语言-剪切板使用_盒曰的博客-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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值