以下内容仅供学习!!!
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. 对话框提示
按照程序提示输入后,客户端会弹出一个对应的对话框。
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
都看到这了,点个赞再走吧~



