C++ Windows 制作远程控制程序

C++ Windows 制作远程控制程序,第1张

以下内容仅供学习!!!

C++ Windows 实现远程控制最好的办法我个人觉得是 winsock,

原理就是Server端发送一个信息,然后Client端接收到信息后就去做对应的 *** 作。

我用的是 VS 2022,要安装好VS MFC先,然后我用的是多字节。

完整代码下载链接在本文底部!

以下是部分代码(此部分代码dev c++也能运行,具体方法见后面):

Server:

#include 
#include 
#include 
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main() {
	WSADATA wsdata;
	WSAStartup(MAKEWORD(2, 2), &wsdata);

	SOCKET hServSock = socket(PF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(4096);
	bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr));

	listen(hServSock, 5);

	SOCKADDR_IN clntAddr;
	int clntAddrSz = sizeof(clntAddr);
	SOCKET hSock;
	int x;
	string s;
	while (true) {
		cout << "正在等待连接!" << endl;
		hSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntAddrSz);
		char IP[1024] = {};
		char Check[1024] = {};
		recv(hSock, IP, 1024, 0);
		system("cls");
		while (recv(hSock, Check, 1024, 0) != -1) {
			cout << "已连接 " << IP << endl;
			cout << "1. 对话框提示" << endl;
			cout << "2. 控制鼠标" << endl;
			cout << "3. 退出控制" << endl << endl;

			cin >> x;
			if (x < 1 || x > 3) continue;
			s = "";
			s[0] = x + '0';

			send(hSock, s.c_str(), 1024, 0);
			if (x == 1) {
				cout << "请输入对话框标题:" << endl;
				getline(cin, s);
				getline(cin, s);
				send(hSock, s.c_str(), 1024, 0);
				cout << "请输入对话框内容:" << endl;
				getline(cin, s);
				send(hSock, s.c_str(), 1024, 0);
			}
			else if (x == 3) break;

			system("cls");
		}
		closesocket(hSock);
		cout << "对方已下线!" << endl;
		Sleep(3000);
		system("cls");
	}

	return 0;
}

功能:
    1. 对话框提示
        按照程序提示输入后,客户端会d出一个对应的对话框。
    
    2.  控制鼠标
        其实就是将对方鼠标固定住,再运行一次解锁。
    
    3. 退出控制
        和Client断开连接。

Client:

#include 
#include 
#include 
#pragma comment(lib, "ws2_32.lib")
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
using namespace std;

string CheckIP() {
	WSADATA wsaData;
	char name[255];
	char* ip;
	PHOSTENT hostinfo;
	string ipStr;

	if (!WSAStartup(MAKEWORD(2, 0), &wsaData)) {
		if (!gethostname(name, sizeof(name))) {
			if ((hostinfo = gethostbyname(name)) != NULL) {
				ip = inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
				ipStr = ip;
			}
		}
		WSACleanup();
	}
	return ipStr;
}

int clip(bool lockb = false) {
	RECT rect = {};
	rect.bottom = 1;
	rect.right = 1;
	if (lockb) return ClipCursor(&rect);
	else return ClipCursor(NULL);
}

int main() {
	WSADATA wsdata;
	WSAStartup(MAKEWORD(2, 2), &wsdata);

	SOCKET hSock = socket(PF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");    // 这里要改成运行Server的电脑的IP,推荐把运行Server的电脑的IP固定住,方法请自行查询!
	servAddr.sin_port = htons(4096);

	connect(hSock, (SOCKADDR*)&servAddr, sizeof(servAddr));
	send(hSock, CheckIP().c_str(), 1024, 0);
	send(hSock, CheckIP().c_str(), 1024, 0);

	int x;
	bool b = true;
	string str;
	char s[1024] = {};
	while (true) {
		recv(hSock, s, 1024, 0);
		x = atoi(s);
		if (x == 1) {
			char title[1024];
			char message[1024];
			recv(hSock, title, 1024, 0);
			recv(hSock, message, 1024, 0);
			MessageBox(NULL, message, title, MB_OK);
		}
        else if (x == 2)  {
			clip(b);
			b = !b;
		}
		else if (x == 3) break;
		send(hSock, CheckIP().c_str(), 1024, 0);
	}

	WSACleanup();
	return 0;
}

这串代码就是完成上面所说的功能的代码,但Server发送一条信息,Client就接收它并执行对应代码,十分简单!有些地方有两个getline的原因是有时候一个getline会被直接跳过!但是这里的代码没有任何实际的伤害性!

用dev c++也能运行这段代码的方法:首先,在dev c++中点击工具,然后点击编译选项,把编译时加入以下命令选上,然后把里面的内容改成-std=c++11,然后再勾选在连接器命令行加入以下命令,然后把里面的内容改成-static-libgcc -l wsock32就可以了。

以下是完整代码下载链接(完全免费,只求一颗小星星):

github下载

如果Github拒绝访问,那么可以参照我在掘金写的Github拒绝访问解决方法

gitee下载

完整代码记得用VS运行!

如有问题,请和我联系,我的邮箱:534086753@qq.com

都看到这了,点个赞再走吧~

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1324036.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)

    保存