引言
哪怕把C语言学完,依然会遇见很多未知的函数。Window.h库里有很多好玩的函数,下面让我们使用这个库中的函数并且尝试实现消息轰炸,这里以QQ为例(轰炸条数任意,轰炸内容可以是某段文字也可以是某个表情包哦)~
分析如何实现“轰炸”效果
程序设计
朋友们,不妨设想一下,我们平时连续发送同一句话“骚扰”朋友的时候,走的是什么路子?
——复制
——粘贴
——发送
——以上步骤循环往复;朋友:有你是我的福气~
哈哈哈,如何用C语言来实现我们的目的呢?各位客官,请看下文~
轰炸步骤
连接QQ窗口
FindWindowA(NULL, "111");//连接QQ窗口
这行代码的释义是连接一个名为“111”的窗口;括号里面是两个参数,一个是发送信息的对象,另一个不使用,写成空指针NULL:
复制信息
复制一次消息后,粘贴无论进行多少次,粘贴结果不变,用户手动Ctrl-V即可~
粘贴信息
SendMessageA(FindWindowA(NULL, "111"), WM_PASTE, NULL, NULL);
进行信息粘贴和发送部分都要使用SendMessage()函数,send是发送的意思,message是信息,也就是发送信息函数。SendMessage()函数转到定义是需要4个参数,所以这里要写上两个NULL(空指针);在这里也是要进行FindWindow()的调用,每粘贴一次,就和QQ进行一次连接;
发送消息
SendMessageA(FindWindowA(NULL, "111"), WM_KEYDOWN, VK_RETURN, NULL);
我们在发送信息时,一般按'发送'或者'Enter'键。那么电脑是使用enter键;其他和上一条同理;
反复进行
循环用起来啊兄弟们,while\for\do-while用起来~
我这里用的是while循环来控制轰炸消息条数。
参考代码
轰炸代码
#include<stdio.h>
#include<windows.h>
int main()
{
int Message = 100;//值可以随意修改或者用scanf函数输入
//Sleep(3000);//运行之前暂停3s
while (Message > 0)
{
FindWindowA(NULL, "111");//连接QQ窗口
//粘贴所复制的信息
SendMessageA(FindWindowA(NULL, "111"), WM_PASTE, NULL, NULL);
//发送信息
SendMessageA(FindWindowA(NULL, "111"), WM_KEYDOWN, VK_RETURN, NULL);
Message--;
}
return 0;
}
代码的详细解释(如果代码只用于整蛊这个地方可以不看)
FindWindowA(LPCSTR IpClassName,LPCSTR IpWindowName)
FindWindowA是WIndow.h库中的一个函数,用于查找窗口句柄,处理的是ANSI编码字符串(如果你需要处理Unicode编码字符串,可以使用FindWindowW函数)。它的作用是根据窗口的类别和窗口名来查找对应的窗口,并且返回该窗口的句柄;
句柄(Handle):是一种用于表示资源或对象的标识符。它是一个无类型的整数,通常用于引用操作系统或应用程序提供的各种资源,如文件句柄、窗口句柄、线程句柄等等。它的主要作用是提供一种对资源或者对象的间接访问方式。通过句柄,应用程序和操作系统可以进行交互,请求操作系统为其分配和管理资源。句柄将资源或对象的具体细节隐藏起来,使得应用程序无需关心资源的具体实现方式,从而提高了代码的可移植性和安全性。
LPCSTR:它是Win32和VC++所使用的一种字符串数据类型。它被定义为一个指向以“\0”结尾的常量字符指针;L表示long;P表示这是一个指针;C表示常量const(虽然无所谓但是啰嗦一句:可以将变量声明为常量,使其不能被重新赋值;注:const关键字修饰的只是变量的可读性而不是存储类型,存储类型不变,常量依然可以是全局变量、局部变量或者函数参数);STR表示这个变量是一个字符串。
参数说明
lpClassName:窗口类名的字符串指针。可以指定具体的类名,也可以使用通配符*(*表示任意多个字符串)来匹配所有类名。
IpWindowName:窗口名的字符串指针。可以指定具体的窗口名,也可以使用通配符*来匹配所有窗口名。
函数返回值
1.如果找到了匹配的窗口,则返回该窗口的句柄。
2.如果未找到匹配的窗口,则返回空指针NULL。
示例代码
#include <Windows.h>
int main() {
HWND hwnd = FindWindowA("Notepad", NULL); // 查找记事本窗口
if (hwnd != NULL) {
// 窗口找到,进行后续操作
printf("Found Notepad window with handle: 0x%x\n", hwnd);
} else {
// 窗口未找到
printf("Notepad window not found\n");
}
return 0;
}
在上述示例中,通过调用 FindWindowA() 函数来查找名为 "Notepad"(记事本)的窗口。如果找到了该窗口,则打印窗口句柄;否则,打印找不到窗口的消息。
LRESULT SendMessageA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);
在 C 语言中, SendMessageA 函数是一个用于向窗口发送消息的函数,它是 Windows API 的一部分;
参数说明
hwnd 表示窗口句柄, Msg 表示要发送的消息, wParam 和 lParam 分别是消息的附加参数。 SendMessageA 函数会将指定的消息发送到指定的窗口,并返回窗口过程处理消息后的结果。
//粘贴所复制的信息
SendMessageA(FindWindowA(NULL, "111"), WM_PASTE, NULL, NULL);
//发送信息
SendMessageA(FindWindowA(NULL, "111"), WM_KEYDOWN, VK_RETURN, NULL);
蛮好记的,PASTE (paste),英文注释就是粘贴;KEYDOWN(keydown)输入或者按下什么键
注意事项
1.窗口名称
窗口名称和备注一致即可,确保窗口名正确哦~
2.连接窗口无法弹出问题
示例代码在VS2013上可以正常运行;如果是VS2022话QQ窗口会弹不出来,那么可以稍微修改一下:加一个延时函数,在延时时间内打开窗口(就是把示例函数中被注释掉的sleep函数那一行取消注释就可以)
sleep函数
在C语言中,sleep()函数的参数以毫秒为单位,sleep(3000)意为程序暂停三秒钟,为我们打开QQ窗口提供时间;