`
zhangziyueup
  • 浏览: 1172519 次
文章分类
社区版块
存档分类
最新评论

调用system函数时,如何隐藏其dos窗口

 
阅读更多
现在要运行一个基于命令行的程序,使用system函数,启动后出现一个dos窗口,由于时间比较长,不美观,想要隐藏这个窗口,不知道有什么办法。

用其他的函数(如shellexec)不知道是否可行。
---------------------------------------------------------------

system函数好象没有提供这样的功能
你可以使用CreateProcess来启动一个进程
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
把dwCreationFlags这个参数设置为CREATE_NO_WINDOW
这个对console程序有效,对纯DOS下的程序无效

希望对你有所帮助!
---------------------------------------------------------------

使用WinExec可以的,不过你得知道使用的应用程序的名称
---------------------------------------------------------------

ShellExecute(..................., SW_HIDE)
---------------------------------------------------------------

用这个 WinExec("xxx.exe", 0); 我用过不会显示 Dos 程序的窗体。
---------------------------------------------------------------

也可以使用ShellExecute();

ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_SHOWNORMAL);
---------------------------------------------------------------

ShellExecute,WinExce都可以达到这个要求
---------------------------------------------------------------

ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_HIDE);
WinExec("xxx.exe", SW_HIDE);
---------------------------------------------------------------

要是我就使用CreateProcess函数,不但可以达到你的功能,还能重新定向标准的输入输出等等,因为有时候你不但要执行他,还要获取他执行的结果啊
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
通过后两个参数你可以做很多有意义的事
---------------------------------------------------------------

用CreateProcess,最后一个参数有进程句柄。调用WaitForSingleObject即可,如:
PROCESS_INFORMATION pi={0};
if(CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,&s,&pi))
{
WaitForSingleObject(pi.hProcess ,INFINITE);
//等待进程执行完毕
CloseHandle(pi.hProcess );
CloseHandle(pi.hThread );
}
---------------------------------------------------------------

是的,和上面几位一样,此时我推荐使用 CreateProcess 来代替 system 设置创建时的参数为 CREATE_NO_WINDOW 来阻目 Dos 窗口的显示,如下所示 :

STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof STARTUPINFO;

PROCESS_INFORMATION pi;
BOOL res = CreateProcess(NULL,
"c://winnt//system32//cmd.exe", // 执行你的 dos 命令
NULL,
NULL,
NULL,
NORMAL_PRIORITY_CLASS ¦ CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&pi);

if (TRUE == res)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}


不要忘记了释放资源哦, good luck. ^_^
分享到:
评论

相关推荐

    API之网络函数---整理网络函数及功能

    SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 ...

    解决C语言中生成的EXE文件执行后窗口消失方法

    C语言中生成的EXE文件执行后窗口消失方法 1.包含头文件时: #include <stdlib.h>/*header file,因为在stdlib.h头文件中定义了system()函数*/ 2.在最后一句加上:system(...实际上system函数是可以调用一些DOS命令

    c语言编译器及工具软件

    安装:直接解包到c:\下,在DOS窗口中运行c:\turboc2下的tc.exe即可 /////////// devcpp-5.1.1.0_32bit_setup: WINDOWS下运行的C语言的集成开发环境,基于GCC编译器。 直接双击安装,而后开始菜单的程序组中点击运行...

    步进电机控制程序

    1、如果电脑已经安装配套的控制软件,可以打开示例直接运行,直接调用OCX控件中函数。 2、如果电脑没有安装配套的控制软件,就需要将OCX文件夹中的.lic和.ocx文件放在指定的路径下。 32位操作系统放在C:\WINDOWS\...

    易语言 茶凉专用模块

    子程序 窗口隐藏显示, 逻辑型, 公开, 显示隐藏指定句柄的窗口(如果显示则隐藏:返回假,如果隐藏则显示:返回真) .参数 窗口句柄, 整数型, 可空, 要显示/隐藏的窗口句柄(可空:则显示/隐藏上次的窗口,如果为初次使用则为...

    delphi 开发经验技巧宝典源码

    0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 0047 在过程中使用常量参数 31 0048 在过程中使用数组参数 31 0049 在过程中使用默认参数 31 2.4 其他 32 0050 如何在...

    Visual C++开发经验技巧宝典(第9章)

    0557 在程序中调用一个子进程直到其结束 371 0558 提取并保存应用程序图标 371 9.5 系统工具 373 0559 为程序添加快捷方式 373 0560 用列表显示系统正在运行的程序 375 0561 如何获得毫秒级时间 376 ...

    Visual C++开发经验技巧宝典(第9章)—1

    0557 在程序中调用一个子进程直到其结束 371 0558 提取并保存应用程序图标 371 9.5 系统工具 373 0559 为程序添加快捷方式 373 0560 用列表显示系统正在运行的程序 375 0561 如何获得毫秒级时间 376 ...

    中文API支持库(1.0-0

    _发送消息() 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。返回值由具体的消息决定。 _发送回调消息() 将一条消息发给窗口。该函数最大的特定是可以立即返回。目标窗口...

    delphi 开发经验技巧宝典源码06

    0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 0047 在过程中使用常量参数 31 0048 在过程中使用数组参数 31 0049 在过程中使用默认参数 31 2.4 其他 32 0050 如何在...

    你必须知道的495个C语言问题

    6.21 当数组是函数的参数时,为什么sizeof不能正确报告数组的大小? 6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小...

    windows下 eclipse+ndk编译及使用jni示例

    6.) 在dos窗口中,cd到项目路径下,运行ndk-build 命令,该命令会自动搜索该路径子目录下的native项目,进行编译。 (Note: 编译完成后不要忘记了刷新项目)。 7.) 重新编译和部署项目,就可以看到已经包含了.so的apk...

    《你必须知道的495个C语言问题》

    4.12 我看到了用指针调用函数的不同语法形式。到底怎么回事? 50 4.13 通用指针类型是什么?当我把函数指针赋向void *类型的时候,编译通不过。 51 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针...

    c#学习笔记.txt

    使用 new 运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用 new 运算符。如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。...

    C# for CSDN 乱七八糟的看不懂

    变量的类型声明 变量的类型声明 每个变量必须预先声明其类型。如 int a; int b = 100; float j = 4.5; string s1; 用 object 可以表示所有的类型。 预定义类型 下表列出了预定义类型,并说明如何使用。 类型 object...

    计算机应用技术(实用手册)

    如设定为SYSTEM则只有在用户想进入BIOS设置时才提示用户输入超级用户口令。 3.Advanced Chipset Features(芯片组设定) 芯片组设定也是Bios设置里面的一个重点设置,这里就详细说明一下! DRAM Timing ...

    Linux高级bash编程

    调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) ...

Global site tag (gtag.js) - Google Analytics