
以下内容仅供学习!!!
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
都看到这了,点个赞再走吧~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)