C&C++ Hide CMD
控制台窗口程序¶
控制台窗口¶
使用 GetConsoleWindow 获取控制台窗口的句柄,然后使用 ShowWindow 函数将其隐藏
#include <windows.h>
int main() {
HWND hwnd = GetConsoleWindow();
ShowWindow(hwnd, SW_HIDE);
// 在这里执行你的程序逻辑
return 0;
}
子进程窗口隐藏¶
如果你的程序启动了一个子进程(例如,通过 CreateProcess 函数),你可以通过设置 STARTUPINFO 结构体的 dwFlags 成员来隐藏子进程的控制台窗口。
#include <windows.h>
int main() {
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
// 在这里设置命令行参数等,然后启动子进程
CreateProcess(NULL, "your_child_process.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
// 在这里执行你的程序逻辑
return 0;
}
GUI程序的实现方法¶
在Windows上,WinMain 和 wWinMain 都是 Windows 应用程序的入口点。它们的主要区别在于字符集和参数类型。
-
字符集:
-
WinMain通常用于 ANSI 字符集,即窄字符(char)。 -
wWinMain用于 Unicode 字符集,即宽字符(wchar_t)。 -
参数类型:
-
WinMain的参数使用LPSTR表示字符串,即 ANSI 字符串。 -
wWinMain的参数使用LPWSTR表示字符串,即 Unicode 字符串。
WinMain¶
在Windows API中,CALLBACK 是一个宏,通常用于标识回调函数的类型。这个宏的定义为:
CALLBACK 定义了回调函数的调用约定,即函数调用的规则。在Windows平台上,__stdcall 是一种常见的调用约定,也叫做标准调用约定。它规定了函数参数的传递方式和调用栈的清理方式。
在特定的情境下,使用正确的调用约定很重要。在Windows API中,很多回调函数都使用 CALLBACK 宏进行声明,以确保它们使用正确的调用约定,能够正确地被系统调用。
在下述代码中,CALLBACK 主要是为了符合 WinMain 函数的声明要求。WinMain 是Windows GUI应用程序的入口点,其声明如下:
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
使用 CALLBACK 宏帮助确保 WinMain 函数按照标准调用约定进行声明,以便与Windows API的期望相符。在这个上下文中,CALLBACK 实际上是 __stdcall 的别名。
第一种实现方式:
#include <Windows.h>
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 函数实现
return 0;
}
第二种实现方式:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
HWND hwnd = GetConsoleWindow();
ShowWindow(hwnd, SW_HIDE);
// 函数实现
return 0;
}
wWinMain¶
-
APIENTRY是一个宏,用于标识函数的调用约定。在 Windows API 中,APIENTRY通常被定义为__stdcall,这是一种常见的调用约定。 -
调用约定规定了函数在被调用时,参数的传递方式、栈的清理方式等规则。在 Windows API 中,
__stdcall是默认的调用约定,也是大多数 Win32 API 函数的标准调用约定。在函数声明中使用APIENTRY或__stdcall用于确保函数按照标准调用约定进行编译。