控制台程序常用技巧

 

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

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>[email protected]</pre> * <pre><b>company: </b>http://blog.csdn.net/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); }

你可能感兴趣的:(工作,exe,Path,跨平台,Signal,linker)