通过一个示例程序,演示了控制台的一些小技 巧:
(http://blog.youkuaiyun.com/donhao/category/687520.aspx)
l 隐藏控制台窗口
l 禁用控制台窗口关闭按钮
l 控制台窗口启动最小化
l 控制台程序开机自启动
l 防 止通过 ctrl+c 关闭控制台窗口(该功能跨平台)
l 为控制台程序添加图标
- /**
- * @file main.cpp
- * @brief 演示了隐藏控制台窗口、禁用关闭按钮、控制台窗 口启动最小化、更改控制台图标的实现。
- * @author Hao Liming
- * @date 2009-1-9 9:11:51
- * @version 0.1
- * <pre><b>copyright: </b></pre>
- * <pre><b>email: </b>hao.limin@gmail.com</pre>
- * <pre><b>company: </b>http://blog.youkuaiyun.com/donhao</pre>
- * <pre><b>All rights reserved.</b></pre>
- * <pre><b>modification:</b></pre>
- * <pre>Write modifications here.</pre>
- */
- /**
- * @brief
- * a.隐藏控制台窗口、禁用关闭按钮、控制台窗口启动最小化、控制台程序开机自启动在main函数中实现.
- * b.更改控制台程序图标的实现在这里进行说明。在VS2008中可以 直接创建图标,并与资源文件绑定。这里仅对VC6进行说明。
- * 1.新建图标文件。“File”->"New"->"Icon File"->本事例输 入文件名为pic,则图标文件名为pic.ico
- * 2.新建资源文件。 “File”->"New"->"Resource Script"->输入与工程同名的资源名称,本示例为 ConsoleManamengent.rc
- * 3.修改资源文件。用记事本工具打开工程目录下的ConsoleManamengent.rc,在最后一行加 入:IDI_ICON1 ICON DISCARDABLE "pic.ico"
- * 4.保存资源文件,重新编译。
- * 5.注意。本演示图标为16称16和32*32。
- * 6.防止通过ctrl+c关闭控制台窗口(该功能跨平台)
- */
- /** @brief 需要包含的头文件*/
- #include <windows.h>
- #include <signal.h>
- #include <stdio.h>
- void BreakDeal( int nSig);
- /** @brief 1. 隐藏控制台窗口*/
- #pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")
- int main( int argc, char * argv[])
- {
- /** @brief 6.防止通过ctrl+c关闭控制台窗口(该功能跨平台)*/
- signal(SIGINT, BreakDeal);
- char buf[MAX_PATH];
- GetConsoleTitle(buf, MAX_PATH);
- HWND hwnd = ::FindWindow(NULL, buf);
- HMENU hmenu = ::GetSystemMenu(hwnd, FALSE);
- if (hwnd)
- {
- /** @brief 2.禁用控制台窗口的关闭按钮*/
- ::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
- /** @brief 3.控制台程序启动时窗口最小化*/
- ::SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
- }
- /** @brief 4.获得服务器启动程序当前路径, 并添加到注册表自启动*/
- TCHAR workingPath[MAX_PATH];
- ZeroMemory(workingPath, MAX_PATH);
- if (GetModuleFileName(NULL, workingPath, MAX_PATH) > 0)
- {
- /** 设置exe程序的工作路径,这里设置为exe文件所在的位置为工作路径*/
- char path[3000];
- memset(path, 0, 3000);
- for ( int i = strlen(workingPath) - 1; i >= 0; --i)
- {
- if (workingPath[i] == '//' )
- {
- strncpy(path, workingPath, i + 1);
- break ;
- }
- }
- SetCurrentDirectory(path);
- /** 取得当前工作路径成功*/
- HKEY hKey;
- if (RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion//Run" , &hKey) != ERROR_SUCCESS)
- {
- /** 创建注册表成功*/
- }
- else
- {
- if (RegSetValueEx(hKey, "CASCO Log Sever" , 0, REG_SZ, (CONST BYTE *)( LPCTSTR )workingPath, strlen(workingPath)) != ERROR_SUCCESS)
- {
- /** 设置注册表失败,不自启动*/
- }
- else
- {
- /** 设置注册表成功,启动设置成 功*/
- }
- RegCloseKey(hKey);
- }
- }
- else
- {
- /** 取得当前工作路径成功失败,不自启动*/
- }
- return 0;
- }
- void BreakDeal( int nSig)
- {
- printf("You can not exit the program by CTRL+C./n" );
- signal(nSig, BreakDeal);
- }