控制台程序常用技巧

通过一个示例程序,演示了控制台的一些小技 巧:

(http://blog.csdn.net/donhao/category/687520.aspx)

l        隐藏控制台窗口

l        禁用控制台窗口关闭按钮

l        控制台窗口启动最小化

l        控制台程序开机自启动

l        防 止通过 ctrl+c 关闭控制台窗口(该功能跨平台)

l 为控制台程序添加图标

 

  1. /**  
  2. * @file main.cpp  
  3. * @brief 演示了隐藏控制台窗口、禁用关闭按钮、控制台窗 口启动最小化、更改控制台图标的实现。  
  4. * @author Hao Liming  
  5. * @date 2009-1-9 9:11:51  
  6. * @version 0.1  
  7. * <pre><b>copyright: </b></pre>  
  8. * <pre><b>email: </b>hao.limin@gmail.com</pre>  
  9. * <pre><b>company: </b>http://blog.csdn.net/donhao</pre>  
  10. * <pre><b>All rights reserved.</b></pre>  
  11. * <pre><b>modification:</b></pre>  
  12. * <pre>Write modifications here.</pre>  
  13. */   
  14.   
  15. /**  
  16. * @brief   
  17. * a.隐藏控制台窗口、禁用关闭按钮、控制台窗口启动最小化、控制台程序开机自启动在main函数中实现.  
  18. * b.更改控制台程序图标的实现在这里进行说明。在VS2008中可以 直接创建图标,并与资源文件绑定。这里仅对VC6进行说明。  
  19. *    1.新建图标文件。“File”->"New"->"Icon File"->本事例输 入文件名为pic,则图标文件名为pic.ico  
  20. *    2.新建资源文件。 “File”->"New"->"Resource Script"->输入与工程同名的资源名称,本示例为 ConsoleManamengent.rc  
  21. *    3.修改资源文件。用记事本工具打开工程目录下的ConsoleManamengent.rc,在最后一行加 入:IDI_ICON1 ICON  DISCARDABLE "pic.ico"  
  22. *    4.保存资源文件,重新编译。  
  23. *    5.注意。本演示图标为16称16和32*32。  
  24. *    6.防止通过ctrl+c关闭控制台窗口(该功能跨平台)  
  25. */   
  26.   
  27. /** @brief 需要包含的头文件*/   
  28. #include <windows.h>   
  29. #include <signal.h>   
  30. #include <stdio.h>   
  31.   
  32. void  BreakDeal( int  nSig);  
  33.   
  34. /** @brief 1. 隐藏控制台窗口*/   
  35. #pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")   
  36.   
  37. int  main( int  argc,  char  * argv[])  
  38. {  
  39.     /** @brief 6.防止通过ctrl+c关闭控制台窗口(该功能跨平台)*/   
  40.     signal(SIGINT, BreakDeal);   
  41.   
  42.     char  buf[MAX_PATH];     
  43.     GetConsoleTitle(buf, MAX_PATH);     
  44.     HWND  hwnd = ::FindWindow(NULL, buf);     
  45.     HMENU  hmenu = ::GetSystemMenu(hwnd, FALSE);     
  46.     if  (hwnd)  
  47.     {  
  48.         /** @brief 2.禁用控制台窗口的关闭按钮*/   
  49.         ::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);  
  50.   
  51.         /** @brief 3.控制台程序启动时窗口最小化*/   
  52.         ::SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);  
  53.     }  
  54.   
  55.     /** @brief 4.获得服务器启动程序当前路径, 并添加到注册表自启动*/   
  56.     TCHAR  workingPath[MAX_PATH];  
  57.     ZeroMemory(workingPath, MAX_PATH);  
  58.   
  59.     if  (GetModuleFileName(NULL, workingPath, MAX_PATH) > 0)  
  60.     {  
  61.         /** 设置exe程序的工作路径,这里设置为exe文件所在的位置为工作路径*/   
  62.         char  path[3000];  
  63.         memset(path, 0, 3000);  
  64.         for  ( int  i = strlen(workingPath) - 1; i >= 0; --i)  
  65.         {  
  66.             if  (workingPath[i] ==  '//' )  
  67.             {  
  68.                 strncpy(path, workingPath, i + 1);  
  69.                 break ;  
  70.             }  
  71.         }  
  72.         SetCurrentDirectory(path);  
  73.   
  74.         /** 取得当前工作路径成功*/   
  75.         HKEY  hKey;  
  76.         if  (RegCreateKey(HKEY_LOCAL_MACHINE,  "SOFTWARE//Microsoft//Windows//CurrentVersion//Run" , &hKey) != ERROR_SUCCESS)  
  77.         {  
  78.             /** 创建注册表成功*/   
  79.         }  
  80.         else    
  81.         {  
  82.             if  (RegSetValueEx(hKey,  "CASCO Log Sever" , 0, REG_SZ, (CONST  BYTE  *)( LPCTSTR )workingPath, strlen(workingPath)) != ERROR_SUCCESS)  
  83.             {  
  84.                 /** 设置注册表失败,不自启动*/   
  85.             }  
  86.             else   
  87.             {  
  88.                 /** 设置注册表成功,启动设置成 功*/   
  89.             }  
  90.             RegCloseKey(hKey);  
  91.         }  
  92.     }  
  93.     else   
  94.     {  
  95.         /** 取得当前工作路径成功失败,不自启动*/   
  96.     }  
  97.     return  0;  
  98. }  
  99.   
  100. void  BreakDeal( int  nSig)  
  101. {  
  102.     printf("You can not exit the program by CTRL+C./n" );  
  103.     signal(nSig, BreakDeal);  

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值