读取目录下的图片写入剪切板然后发送到qq窗口

news/2024/12/30 2:05:31/

        平时为了奖励群友,把自己私藏的好康图片发给群友,但是一张一张发太过于麻烦,于是就想着写一个脚本。用C语言写的。具体涉及到读取文件夹下的文件,剪切板操作,跟键盘事件的相关操作,控制台窗口字体颜色修改。废话不多说,源码贴上。

        控制台窗口字体修改

        

void color(short x) 
{if (x >= 0 && x <= 15)//参数在0-15的范围颜色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);else//传入x的参数不在0到15默认颜色为白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

        键盘事件

void Chat(char *windowText)
{HWND h_win= FindWindowA(NULL,windowText);//根据窗口标题获取窗口句柄SetForegroundWindow(h_win);//将需要发送消息的窗口置顶keybd_event(VK_CONTROL, 0,0,0 );//模拟键盘按下Ctrlkeybd_event('V', 0, 0, 0);//模拟键盘按下Vkeybd_event('V', 0, 2, 0);//模拟键盘松开Vkeybd_event(VK_CONTROL, 0, 2, 0);//模拟键盘松开Ctrlkeybd_event(VK_RETURN, 0, 0, 0);//模拟键盘按下回车keybd_event(VK_RETURN, 0, 2, 0);//模拟键盘松开回车
}

文件夹下的文件读取

/*
参数一:需要读取的目录
参数二: 需要发送窗口的标题(主要是在下do while语句处理文件时给指定窗口传参使用)
返回值: 一个标识,没有具体的意义
*/
int rFwCV(char *dir, char* windowText)
{
//定义两个文件结构体,里面存放的就是读取到文件夹下文件的信息,具体可以百度搜索struct _finddata_t fileinfo1;//文件存储信息结构体 struct _finddata_t fileinfo2;
//因为这边我们收藏的图片有.jpg跟.png所以我们定义两个文件句柄,处理这两种不同的文件类型,毕竟不能只发一部分吧。奖励群友就要彻底好吧。	long fjpgHandle=0;//保存文件句柄 long fpngHandle=0;int i = 0;//记录文件个数char* jpgfile = (char*)malloc(strlen(dir) + strlen((char *)"\\*.jpg")+1);//设置存放读取到的.jpg格式的文件的路径char* pngfile = (char*)malloc(strlen(dir) + strlen((char *)"\\*.png") + 1);//设置存放读取到的.png格式的文件的路径join(jpgfile, dir,(char *)"\\*.jpg");//自己写的一个字符串拼接函数,可以自己实现或者用sprintf()函数join(pngfile, dir, (char*)"\\*.png");fjpgHandle = _findfirst(jpgfile, &fileinfo1);//第一次查找指定类型的文件fpngHandle = _findfirst(pngfile, &fileinfo2);if (fjpgHandle == -1L&& fpngHandle == -1L)//返回值为-1则不存在该类型文件{printf("\t当前目录下没有.png文件或者.jpg文件\n");return 0;}else {/*下面是分成三种情况,,jpg类型不存在或者.png类型不存在,或者都存在的情况去处理*/if (fjpgHandle != -1 && fpngHandle != -1){do{/*这里就可以添加处理你获得的指定文件的代码*/} while ((_findnext(fjpgHandle, &fileinfo1) == 0) && (_findnext(fpngHandle, &fileinfo2) == 0));//遍历下一个类型的文件,具体可查msdn_findclose(fjpgHandle);//使用完句柄记得关闭_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}else if (fjpgHandle != -1L && fpngHandle == -1L){do{/*这里就可以添加处理你获得的指定文件的代码*/} while (_findnext(fjpgHandle, &fileinfo1) == 0 );_findclose(fjpgHandle);_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}else {do{/*这里就可以添加处理你获得的指定文件的代码*/} while ((_findnext(fpngHandle, &fileinfo2) == 0));_findclose(fjpgHandle);_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}}}

        将图片文件写入剪切板

/*    将图片写入剪贴板的原理大致是:先将图片转化为bitmap格式(因为剪贴板图片仅支持bitmap格式其他格式写不进去)这里使用 Gdiplus提供的类去进行转化.具体可以百度了解这个类,我就不过多介绍。这个是我抄其他博客的代码来源:https://stackoverflow.com/questions/39200677/how-to-copy-a-picture-from-disk-into-the-clipboard-with-win32
*/
static bool CopyFileToClipboard(const wchar_t* path)//参数一:图片的绝对路径
{bool result = false;Gdiplus::Bitmap* gdibmp = Gdiplus::Bitmap::FromFile(path);if (gdibmp){HBITMAP hbitmap;gdibmp->GetHBITMAP(0, &hbitmap);if (OpenClipboard(NULL)){EmptyClipboard();//清空剪贴板DIBSECTION ds;if (GetObject(hbitmap, sizeof(DIBSECTION), &ds)){HDC hdc = GetDC(HWND_DESKTOP);//create compatible bitmap (get DDB from DIB)HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);ReleaseDC(HWND_DESKTOP, hdc);SetClipboardData(CF_BITMAP, hbitmap_ddb);DeleteObject(hbitmap_ddb);result = true;}CloseClipboard();}//cleanup:DeleteObject(hbitmap);delete gdibmp;}return result;
}

最后不多说了,把我完整的代码奉上,全部复制粘贴到.cpp文件中编译就可以使用,至于项目的配置,你百度就可以解决了,不然你在私聊我呗。

#include <stdio.h>
#include <Windows.h>
#include <io.h>
#include <WinUser.h>
#include <atlconv.h>
#include <GdiPlus.h>
#include <time.h>
#pragma comment(lib, "Gdiplus.lib")void color(short x) //自定义函根据参数改变颜色 
{if (x >= 0 && x <= 15)//参数在0-15的范围颜色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);else//默认的颜色白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}void Chat(char *windowText)
{HWND h_win= FindWindowA(NULL,windowText);SetForegroundWindow(h_win);keybd_event(VK_CONTROL, 0,0,0 );keybd_event('V', 0, 0, 0);keybd_event('V', 0, 2, 0);keybd_event(VK_CONTROL, 0, 2, 0);keybd_event(VK_RETURN, 0, 0, 0);keybd_event(VK_RETURN, 0, 2, 0);
}void join(char* str1, char* str2,char *str3=NULL)
{sprintf(str1, "%s", str2);if (str3 != NULL){sprintf(str1, "%s%s", str2,str3);}
}static bool CopyFileToClipboard(const wchar_t* path)
{bool result = false;Gdiplus::Bitmap* gdibmp = Gdiplus::Bitmap::FromFile(path);if (gdibmp){HBITMAP hbitmap;gdibmp->GetHBITMAP(0, &hbitmap);if (OpenClipboard(NULL)){EmptyClipboard();DIBSECTION ds;if (GetObject(hbitmap, sizeof(DIBSECTION), &ds)){HDC hdc = GetDC(HWND_DESKTOP);//create compatible bitmap (get DDB from DIB)HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);ReleaseDC(HWND_DESKTOP, hdc);SetClipboardData(CF_BITMAP, hbitmap_ddb);DeleteObject(hbitmap_ddb);result = true;}CloseClipboard();}//cleanup:DeleteObject(hbitmap);delete gdibmp;}return result;
}int rFwCV(char *dir, char* windowText)
{//文件存储信息结构体 struct _finddata_t fileinfo1;struct _finddata_t fileinfo2;//保存文件句柄 long fjpgHandle=0;long fpngHandle=0;int i = 0;//记录文件个数char* jpgfile = (char*)malloc(strlen(dir) + strlen((char *)"\\*.jpg")+1);char* pngfile = (char*)malloc(strlen(dir) + strlen((char *)"\\*.png") + 1);join(jpgfile, dir,(char *)"\\*.jpg");join(pngfile, dir, (char*)"\\*.png");fjpgHandle = _findfirst(jpgfile, &fileinfo1);fpngHandle = _findfirst(pngfile, &fileinfo2);if (fjpgHandle == -1L&& fpngHandle == -1L){printf("\t当前目录下没有.png文件或者.jpg文件\n");return 0;}else {if (fjpgHandle != -1 && fpngHandle != -1){do{i++;char* Imgpath1 = (char*)malloc(strlen(dir) + strlen("\\") + strlen(fileinfo1.name) + 1);char* Imgpath2= (char*)malloc(strlen(dir) + strlen("\\") + strlen(fileinfo1.name) + 1);sprintf(Imgpath1, "%s%s%s", dir, "\\", fileinfo1.name);sprintf(Imgpath1, "%s%s%s", dir, "\\", fileinfo2.name);USES_CONVERSION;//A2W的宏Gdiplus::GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);CopyFileToClipboard(A2W(Imgpath1));CopyFileToClipboard(A2W(Imgpath2));Gdiplus::GdiplusShutdown(gdiplusToken);Chat(windowText);Sleep(1000);} while ((_findnext(fjpgHandle, &fileinfo1) == 0) && (_findnext(fpngHandle, &fileinfo2) == 0));_findclose(fjpgHandle);_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}else if (fjpgHandle != -1L && fpngHandle == -1L){do{i++;char* Imgpath = (char*)malloc(strlen(dir) + strlen("\\") + strlen(fileinfo1.name) + 1);sprintf(Imgpath, "%s%s%s", dir, "\\", fileinfo1.name);USES_CONVERSION;//A2W的宏Gdiplus::GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);CopyFileToClipboard(A2W(Imgpath));Gdiplus::GdiplusShutdown(gdiplusToken);Chat(windowText);Sleep(1000);} while (_findnext(fjpgHandle, &fileinfo1) == 0 );_findclose(fjpgHandle);_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}else {do{i++;char* Imgpath = (char*)malloc(strlen(dir) + strlen("\\") + strlen(fileinfo2.name) + 1);sprintf(Imgpath, "%s%s%s", dir, "\\", fileinfo2.name);USES_CONVERSION;//A2W的宏Gdiplus::GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);CopyFileToClipboard(A2W(Imgpath));Gdiplus::GdiplusShutdown(gdiplusToken);Chat(windowText);Sleep(1000);} while ((_findnext(fpngHandle, &fileinfo2) == 0));_findclose(fjpgHandle);_findclose(fpngHandle);printf("\t共发送%d张图片\n", i);return 0;}}}void menu()
{system("cls");srand(unsigned(time(NULL)));int col = rand() % 16;color(col);printf("\t---------------------欢迎使用龙德学院炼金术士开发的qq图片奖励代码----------------\n");printf("\t请输入图片奖励代码的文件夹路径(绝对路径)\n");}
int main()
{char Imgpath[100] = {0};char Windtext[100] = { 0 };while (true){menu();scanf("%s", &Imgpath);system("pause");printf("\n");printf("需要发送到的窗口标题: ");scanf("%s",&Windtext);rFwCV(Imgpath, Windtext);system("pause");}return 0;
}

效果演示

                                         视频演示

 

实际演示


http://www.ppmy.cn/news/826793.html

相关文章

常用快捷键大全

一、系统快捷键 F1 帮助F2 改名F3 搜索 F4 地址F5 刷新F6 切换F8 安全模式F10 菜单F11 全屏INS 插入模式PRTSCSYSRQ 截屏CAPSLOCK 大写字母锁定DELETE 删除ESC 退出HOME 到开始或主程序END 到结尾PAGEUP 向上翻页PAGEDOWN 向下翻页TAB 改变焦点 CTRLC 复制CTRLX 剪切CTRLV 粘贴…

qq键盘快捷键大全

qq键盘快捷键大全Ctrl A 全选Ctrl B 整理收藏夹Ctrl C 复制Ctrl D 删除/添加收藏 (在Word中是修改选定字符格式,在IE及傲游中是保存为收藏)Ctrl E 搜索助理 在Word中是段落居中Ctrl F 查找Ctrl G 在Word中是定位Ctrl H 历史记录 在Word中是替换Ctrl I 收藏夹Ctrl J IE…

RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

前言&#xff1a;在生产环境中由于一些不明原因&#xff0c;导致RabbitMQ重启的情况下&#xff0c;在RabbitMQ重启期间生产者投递消息失败&#xff0c;生产者发送的消息会丢失&#xff0c;那这时候就需要去想在极端的情况下&#xff0c;RabbitMQ集群不可用的时候&#xff0c;如…

metersphere主从节点部署

metersphere主从节点关系 环境搭建 docker 环境准备 检查内存是否大于8G free -m 安装docker服务 安装docker&#xff0c;使用yum -y install docker&#xff1b; 启动docker&#xff0c;使用systemctl start docker&#xff1b; 设置开机启动&#xff0c;使用systemctl en…

集成显卡、核显、独显和双显的区别是什么

在选择计算机时&#xff0c;我们经常会听到集成显卡、核显、独立显卡和双显卡等术语。这些都是不同的显卡配置选项&#xff0c;它们对于图形处理能力和性能有着不同的影响。本文将介绍集成显卡、核显、独立显卡和双显卡之间的区别&#xff0c;帮助你更好地了解这些配置。 一、集…

vue 一个div中三个子div水平布局,一个子div屏幕中间,其他两个子div 依次靠右

一个div 宽度100% 高度10%,其中包含三个子div横向排列, 第一个子div,背景色蓝色,宽度10%,位置是显示屏水平居中,其他两个子div,宽度都是10%,一个背景色黑色,一个背景色灰色 依次水平方向靠右,并且最右边的子div,距离右边距20px, 1 第一种 <div style"width: 100%; he…

防抖算法开发

yal pitch row 平移&#xff0c;旋转&#xff0c; 九轴防抖。