如何隐藏win32 控制台程序的console窗口

如下设置
#pragma   comment(   linker,   "/subsystem:/ "windows/ "   /entry:/ "mainCRTStartup/ " "   )   //   设置入口地址  
这样就ok了


大家都知道,当编写一个win32   console   application时,当运行此类程序的时候
默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序
中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自
动退出.

下面就介绍一下,如何隐藏win32   console   application的console窗口

因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译
器的链接开关选项(也就是linker选项).

首先我们来看一下linker的   /subsystem   选项

该选项的语法形式如下:
/SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
                        EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
                        [,major[.minor]]

这个链接选项告诉操作系统如何运行可执行文件

CONSOLE:
win32   字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS
窗口的控制台窗口,如果在应用程序的主函数为main()或者wmain(),在默认情况下
该应用程序就是一个控制台应用程序

Extensible   Firmware   Interface
和CPU具体架构相关的一个参数选项,并不常用,在这里暂

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC调用win32窗口显示调试信息,使用AllocConsole 函数(2010-11-16 15:33:25)转载标签: 调试win32mfc杂谈 分类: 编译器 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI AllocConsole(void); 参数: 无 返回值:如果函数成功,返回值是非零值;如果函数失败,返回值是零值。 备注: 一个进程仅能关联一个控制台,所以该函数在主调进程已经具有控制台时将会失败。 一个进程可以使用 FreeConsole 函数来释放与之关联的控制台,之后它就可以调用该函数来创建一个新的控制台或使用 AttachConsole 函数来关联另一个控制台。 如果主调进程创建了一个子进程,则子进程也将继承这个新创建的控制台。 该函数为新的控制台初始化标准输入、输出、错误句柄等。 标准输入句柄是一个控制台输入缓冲的句柄,标准输出和标准错误句柄则是控制台屏幕缓冲的句柄。为了获得这些句柄,可以使用 GetStdHandle 函数。 该函数主要用于GUI应用程序来创建一个控制台窗口。 GUI应用程序初始化时时没有控制台的,而控制台应用程序则以控制台来初始化的。 要求 : Minimum supported client Windows 2000 Professional Minimum supported server Windows 2000 Server Header: Wincon.h (include Windows.h) Library: Kernel32.lib DLL Kernel32.dll ---------------------------------------------------------------------------------------- 虽然WIN32时代是图形界面时代,但偶尔程序中还需要用到命令行模式,比如批处理,这时再搞个图形界面出来显得似乎就不那么专业了。但客户还需要在正常状态下(对于命令行模式,我认为用户是非正常状态,比如脑子进水。)使用图形界面,这决定我们不能开一个控制台工程,而需要使用MFC exe程序。 OK,理所当然的,通过条件控制,命令行下我关掉对话框界面的调用代码,再使用 cout << "Hello world!" << endl; 来向这个友好的世界打个招呼,并坚持认为这句问候应该显示在CMD那个漆黑的窗口里。 很沮丧地说,事实给我与痛击。cmd窗口里仍然漆黑一片,系统完全不理会我的友好。 邓爷爷说,改革开放好!也许,我也需要个改革。 在同事mr. zhang的指导下,我找到一组API:Console Functions!正是这组API,最终让我的友好得以正当地表达。 一。创建一个Console,AllocConsole 直接使用 AllocConsole(); 马上,若是进程内第一次调用这个函数,一个空的cmd窗口会蹦出来。需要注意,一个进程只能创建一个console,多次调用会返回FALSE;而且,这个窗口是个独立的控制台窗口。 MSDN的解释:A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. 还有段:If the calling process creates a child process, the child inherits the new console. 二。显示Hello World,WriteConsole 有了console,我们还需要获取它的句柄HANDLE,然后才能在上面显示。方法是 GetStdHandle,它会获取前面我们AllocConsole得到的cmd窗口的句柄;若未调用AllocConsole,将获取标准的输入输出窗口句柄。 MSDN的解释:The GetStdHandle function returns a handle for the standard input, standard output, or standard error device. HANDLE hdlWrite = GetStd
### 回答1: 在VS2010中使用Win32控制台应用程序来实现定时器功能有以下步骤: 1. 打开VS2010,选择创建新项目,选择Win32控制台应用程序模板。 2. 在下一步中,选择空项目并勾选“空项目”选项。 3. 创建项目后,进入“解决方案资源管理器”,右击项目名称,选择“属性”。 4. 在属性窗口中,选择“配置属性” > “链接器” > “系统”,将“子系统”选择为“控制台(/SUBSYSTEM:CONSOLE)”,然后点击“应用”按钮保存更改。 5. 打开“main.cpp”文件,进行编码。 6. 在代码中,首先包含头文件`#include<Windows.h>`,用于使用Windows API。 7. 在代码中定义回调函数`VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)`作为定时器事件处理函数。 8. 在`main()`函数中,使用`SetTimer(NULL, 0, 1000, TimerProc)`来设置定时器,第一个参数为窗口句柄,若为NULL表示当前控制台窗口,第二个参数为定时器 ID,若为0表示不需要 ID,第三个参数为定时器间隔时间(毫秒),第四个参数为定时器事件处理函数。 9. 程序运行后,每隔1秒会调用一次定时器事件处理函数。 10. 在定时器事件处理函数中,可以进行需要定时执行的操作,例如输出一段文字,并且保存到文件中,或者执行其他需要定时执行的任务。 以上就是在VS2010中使用Win32控制台应用程序实现定时器功能的大致步骤。具体的实现细节可以根据实际需求进行调整和修改。 ### 回答2: 在VS2010中,我们可以使用Win32控制台应用程序来实现定时器的功能。下面是一个简单的示例: 首先,我们需要包含Windows头文件和一些必要的函数库: ```c #include <Windows.h> #include <iostream> #pragma comment(lib, "winmm.lib") ``` 在控制台应用程序的入口点main函数中,我们可以定义一个定时器函数来处理定时器事件,通过SetTimer函数来设置定时器: ```c VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { std::cout << "定时器触发!" << std::endl; } int main() { UINT_PTR timerId = SetTimer(NULL, 0, 1000, TimerProc); // 设置定时器,每隔1秒钟触发一次TimerProc函数 if (timerId == 0) { std::cout << "定时器设置失败!" << std::endl; return 1; } // 主循环 MSG msg; BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // 错误处理 return 1; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } KillTimer(NULL, timerId); // 停止定时器 return 0; } ``` 上述代码中,我们定义了一个名为TimerProc的回调函数,该函数会在定时器到达指定时间间隔时被调用。在main函数中,我们使用SetTimer函数设置一个1秒钟的定时器,并传入回调函数TimerProc。然后进入主循环,等待消息的到来。最后,在程序结束前,我们使用KillTimer函数停止定时器。 以上就是在VS2010中使用Win32控制台应用程序实现定时器的简单示例。当定时器触发时,会在控制台输出"定时器触发!"。需要注意的是,由于控制台应用程序是基于消息循环的,所以需要在主循环中处理消息,以便正常接收和处理定时器事件。 ### 回答3: 在VS2010中使用Win32控制台应用程序来使用定时器实例主要有以下步骤: 1. 创建一个新的Win32控制台应用程序项目。 2. 在主函数中,使用SetTimer函数来创建定时器。SetTimer函数的原型如下: UINT_PTR SetTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR nIDEvent, // 定时器标识符,可以自定义一个ID UINT uElapse, // 定时器间隔时间,以毫秒计算 TIMERPROC lpTimerFunc // 定时器回调函数,即定时器事件处理函数 ); 3. 在定时器回调函数中处理定时器事件。定时器回调函数的原型如下: VOID CALLBACK TimerProc( HWND hwnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT uMsg, // 消息标识符 UINT_PTR idEvent, // 定时器标识符,与SetTimer函数传入的值相同 DWORD dwTime // 当前时间 ); 4. 在定时器回调函数中可以添加需要定时执行的逻辑,例如打印一些信息。 5. 调用GetMessage函数或使用无限循环语句来保持控制台程序的运行。 6. 在程序结束前,使用KillTimer函数取消定时器。KillTimer函数的原型如下: BOOL KillTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR uIDEvent // 定时器标识符,与SetTimer函数传入的值相同 ); 以上是在VS2010中使用Win32控制台应用程序来使用定时器实例的基本步骤。定时器可以用于定时执行某些任务或事件,例如更新数据、刷新界面等。控制台应用程序没有窗口句柄,但定时器函数仍然可以使用,只需要将窗口句柄参数传入NULL即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值