#include #include #include #include #include #include #include #include #include #include #include #include #include
#define SHM_FLAG 0666
// 模擬系統(tǒng)進(jìn)程的窗口類名和標(biāo)題 #define WINDOW_CLASSNAME "Shell_TrayWnd" #define WINDOW_TITLE "任務(wù)欄"
typedef struct { DWORD pid; int sockfd; } share_data;
// 關(guān)閉相鄰進(jìn)程 void CloseAdjacentProcess(DWORD pid);
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
void* thread_func(void* arg) { // 創(chuàng)建Socket并綁定 int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = IN_ANY; servaddr.sin_port = htons(0); if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind error"); exit(1); }
?
// 獲取已分配的端口號(hào)
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
getsockname(sockfd, (struct sockaddr*)&addr, &len);
int port = ntohs(addr.sin_port);
// 創(chuàng)建Socket并連接到服務(wù)器
const char* server_ip = "127.0.0.1";
int server_port = 12345;
int server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
connect(server_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// 發(fā)送自己的Socket端口號(hào)
share_data share_data;
share_data.pid = 0;
share_data.sockfd = sockfd;
write(server_sockfd, &share_data, sizeof(share_data));
// 監(jiān)聽Socket
listen(sockfd, 1);
// 接受客戶端連接
int connfd = accept(sockfd, (struct sockaddr*)NULL, NULL);
// 讀取共享內(nèi)存中PID
DWORD pid = 0;
read(connfd, &pid, sizeof(DWORD));
// 寫入當(dāng)前程序的PID
DWORD my_pid = GetCurrentProcessId();
write(connfd, &my_pid, sizeof(DWORD));
// 執(zhí)行1 + 1操作
int a = 1, b = 1;
int sum = a + b;
// 判斷結(jié)果是否等于2,如果等于2則關(guān)閉相鄰進(jìn)程
if (sum == 2) {
??// 獲取共享內(nèi)存中的數(shù)據(jù),判斷是否已經(jīng)在其他線程中關(guān)閉了相鄰進(jìn)程
??share_data other_share_data;
??read(connfd, &other_share_data, sizeof(other_share_data));
??DWORD other_pid = other_share_data.pid;
??if (other_pid != 0 && other_pid != pid) {
????// 關(guān)閉相鄰進(jìn)程
????CloseAdjacentProcess(other_pid);
????// 發(fā)送自己的PID到對(duì)方進(jìn)程
????share_data.pid = my_pid;
????write(other_share_data.sockfd, &share_data, sizeof(share_data));
????// 將程序窗口圖標(biāo)置灰
????PROCESSENTRY32 entry;
????entry.dwSize = sizeof(PROCESSENTRY32);
????HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
????if (Process32First(hSnap, &entry)) {
??????do {
????????if (entry.th32ProcessID == other_pid) {
??????????// 枚舉進(jìn)程的所有窗口,并將圖標(biāo)置灰
??????????EnumWindows(EnumWindowsProc, (LPARAM)other_pid);
??????????break;
????????}
??????} while (Process32Next(hSnap, &entry));
????}
????CloseHandle(hSnap);
??}
??// 分離共享內(nèi)存
??close(other_share_data.sockfd);
??close(connfd);
??close(sockfd);
??return NULL;
}
// 發(fā)送共享內(nèi)存中的PID到下一個(gè)線程
share_data.pid = pid;
write(server_sockfd, &share());
// 分離共享內(nèi)存
shmdt(ptr);
return NULL;
?
}
int main() { const int NUM_THREADS = 5; const int port = 12345; const char* server_ip = "127.0.0.1";
?
// 請(qǐng)求管理員權(quán)限
char path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
ShellExecute(NULL, "runas", path, NULL, NULL, SW_SHOW);
// 創(chuàng)建Socket并連接到服務(wù)器
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, server_ip, &servaddr.sin_addr);
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
// 創(chuàng)建共享內(nèi)存
int shmid = shmget(IPC_PRIVATE, sizeof(share_data), IPC_CREAT | SHM_FLAG);
if (shmid == -1) {
??perror("shmget failed");
??exit(1);
}
// 獲取共享內(nèi)存指針
share_data* ptr = (share_data*)shmat(shmid, NULL, 0);
if (ptr == (void*) -1) {
??perror("shmat failed");
??exit(1);
}
// 初始化共享內(nèi)存
ptr->pid = 0;
ptr->sockfd = sockfd;
// 創(chuàng)建多個(gè)線程
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
??pthread_create(&threads[i], NULL, thread_func, NULL);
}
// 等待線程結(jié)束
for (int i = 0; i < NUM_THREADS; i++) {
??pthread_join(threads[i], NULL);
}
// 刪除共享內(nèi)存
shmctl(shmid, IPC_RMID, NULL);
return 0;
?
}
// 關(guān)閉相鄰進(jìn)程 void CloseAdjacentProcess(DWORD pid) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (hProcess != NULL) { BOOL bRet = TerminateProcess(hProcess, 0); CloseHandle(hProcess); } }
// 枚舉窗口回調(diào)函數(shù) BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid = 0; GetWindowThreadProcessId(hwnd, &pid); if (pid == (...DWORD)lParam) { // 將窗口圖標(biāo)置灰 HICON hIcon = LoadIcon(NULL, IDI_APPLICATION); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); return FALSE; } return TRUE; }??
標(biāo)簽: