超级简单的代码段,有手就能写!
首先呢我们先引入这些头文件
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <windows.h>
wchar.h 主要用于处理用户输入的窗口名,将其从ASCII字符转换为宽字符,由于C语言本身并不支持汉字所以需要用到wchar.h来进行宽字符处理
locale.h 主要是用于提供本地化支持,日期,格式,货币符号,等等…
windows.h 主要用于获取窗口和操作窗口
// 设置程序的区域设置,使其支持多语言字符
setlocale(LC_ALL, "");
int c = 0; // 用于存储用户输入的消息发送次数
char b[100]; // 用于存储用户输入的窗口名(ASCII字符)
wchar_t w[100]; // 用于存储转换后的窗口名(宽字符)
// 提示用户操作步骤
printf("说明:现复制,然后打开你要发消息的人的窗口后输入次数后再输入名字就行了\n记得把QQ发送消息按键改为enter\n");
// 获取用户输入的消息发送次数
printf("number:");
scanf_s("%d", &c);
// 获取用户输入的窗口名
printf("name:");
scanf_s("%s", b, 100);
scanf和scanf_s
scanf函数在读取的时候不会对边缘进行边界检查可能会导致缓冲区溢出的报错,比如你有一个大小为10的数组,使用scanf如果你输入的字符串长度超过了10那么就会导致缓冲区溢出
scanf_s函数会让你指定大小来防止上面的问题:
scanf_s(“%s”, b, 100)后面的100是b数组的大小,是scanf_s函数的一个安全特性,可以防止超过数组大小的输入导致的缓冲区溢出。
有人可能有疑问他为什么没有&运算符来指向地址,因为数组名本身就是一个指向第一个元素的指针,所以就不用&运算符了
// 将ASCII字符转换为宽字符
MultiByteToWideChar(CP_ACP, 0, b, -1, w, 100);
MultiByteToWideChar主要是干嘛的:
MultiByteToWideChar 一个Windows API中的函数,主要负责多字符串转换宽字符串
CP_ACP 代码页,表示用系统默认的windows ANSI代码页进行转换
0 标志,表示没有特殊转换
b 就是之前声明的变量要进行转换的字符串
-1 就是表示用null结尾,停止转换并返回转换的字符数,说简单点就是这个数组b从b[0]开始到b[\0],意思是数组的最后的\0结束。
w 就是之前声明的变量准备接受的字符串的缓冲区
100 就是大小啦,缓冲区大小
// 查找窗口
HWND a = FindWindow(NULL, w);
// 如果找到了窗口
if (a != NULL) {
// 循环发送消息
while (c != 0) {
// 发送粘贴消息,将剪贴板内容粘贴到窗口
SendMessage(a, WM_PASTE, 0, 0);
// 发送回车键消息,相当于按下回车键
SendMessage(a, WM_KEYDOWN, VK_RETURN, 0);
// 消息发送次数减1
c--;
// 打印剩余的消息发送次数
printf("获取到发送 剩余%d\n", c);
}
}
// 如果没有找到窗口
else {
// 打印错误信息
printf("'%s' 没找到,close", b);
}
HWND: 一个句柄类型,是Handle to a Window的缩写,可以通过这个句柄在程序中来操作窗口
FindWindow: windows API中的一个用于获取顶级窗口的函数。
NULL:表示查找所有类型的窗口,而不是特定的窗口,如果要查找特定的窗口可以输入它的类名进行查找,注意区分大小写哦
w:存好的窗口名字
SendMessage:windows API中的一个用于将一个消息发送到特定窗口的函数
a:窗口句柄,指定接受消息的窗口。
WM_PASTE:粘贴操作
WM_KEYDOWN:表示指定一个非系统按键按下时就会发送到焦点窗口,说简单点就是一个虚拟按键按下时就会在聊天框中执行那个按键的功能
VK_RETURN:表示回车键,enter
源码:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <windows.h>
int main() {
// 设置程序的区域设置,使其支持多语言字符
setlocale(LC_ALL, "");
int c = 0; // 用于存储用户输入的消息发送次数
char b[100]; // 用于存储用户输入的窗口名(ASCII字符)
wchar_t w[100]; // 用于存储转换后的窗口名(宽字符)
// 提示用户操作步骤
printf("说明:现复制,然后打开你要发消息的人的窗口后输入次数后再输入名字就行了\n记得把QQ发送消息按键改为enter\n");
// 获取用户输入的消息发送次数
printf("number:");
scanf_s("%d", &c);
// 获取用户输入的窗口名
printf("name:");
scanf_s("%s", b, 100);
// 将ASCII字符转换为宽字符
MultiByteToWideChar(CP_ACP, 0, b, -1, w, 100);
// 查找窗口
HWND a = FindWindow(NULL, w);
// 如果找到了窗口
if (a != NULL) {
// 循环发送消息
while (c != 0) {
// 发送粘贴消息,将剪贴板内容粘贴到窗口
SendMessage(a, WM_PASTE, 0, 0);
// 发送回车键消息,相当于按下回车键
SendMessage(a, WM_KEYDOWN, VK_RETURN, 0);
// 消息发送次数减1
c--;
// 打印剩余的消息发送次数
printf("获取到发送 剩余%d\n", c);
}
}
// 如果没有找到窗口
else {
// 打印错误信息
printf("'%s' 没找到,close", b);
}
return 0;
}
PS:最后感谢您的阅读,如果哪里有错误欢迎指出 🙂
暂无评论内容