标签: console-application

是否可以构建一个双击时不显示控制台窗口的控制台应用程序?

相关:
我应该在我的应用程序中包含命令行模式吗?
如何获取父进程标准输出?
控制台应用程序可以检测它是否已从资源管理器运行?

我想构建一个控制台应用程序,通常从命令行运行.

但是,当它从资源管理器中双击(而不是从cmd.exe提示符运行)时,我希望该程序不显示控制台窗口.

我想避免这个:

替代文字http://i36.tinypic.com/1088p5s.jpg

可能吗?

编辑我想另一种问题是,程序是否有可能知道它是如何被调用的 - 无论是通过双击还是通过命令行

我在Windows上使用.NET.

编辑2:这篇Old New Thing博客文章中我学到了一些好东西.这就是我现在所知道的......

在Windows中,EXE文件标记为GUI或非GUI.使用csc.exe,可以使用/target:winexe或选择它/target:exe.在执行流程中的第一条指令之前,Windows内核会设置执行环境.此时,如果EXE标记为GUI,则内核将进程的stdin/stdout设置为NULL,如果非GUI(命令行),则内核创建控制台并将进程的stdin/stdout设置为安慰.

启动进程时,如果没有stdin/stdout(== /target:winexe),则立即返回调用.因此,从cmd.exe启动gui应用程序,您将立即返回cmd提示符.如果存在stdin/stdout,并且从cmd.exe运行,则父cmd.exe将等待进程退出.

"立即返回"很重要,因为如果您编写GUI应用程序以附加到其父控制台,您将能够执行console.writeline等.但cmd.exe提示是活动的.用户可以键入新命令,启动新进程等.换句话说,从winexe,只需附加到父控制台,AttachConsole(-1)不会"变成"控制台应用程序.


此时我认为允许应用程序使用控制台的唯一方法是从cmd.exe调用它,而不是在双击时使用它,就是将exe定义为常规控制台exe(/target:exe),并且如果合适,在启动时隐藏窗口.您仍然会暂时显示控制台窗口.

我仍然没有想过如何知道它是从explorer或cmd.exe启动的,但我越来越近了..


解答

无法构建不显示控制台窗口的控制台应用程序.

是可能的构建非常迅速隐藏其窗口控制台应用程序,但不能如此之快,这是因为如果从来没有出现的窗口.

现在,为了确定是否从资源管理器启动了一个控制台应用程序,有些人建议查看它正在运行的控制台
(来自mgb的答案知识库文章99115):

  int left = Console.CursorLeft;
  int top = Console.CursorTop;
  bool ProcessWasRunFromExplorer = (left==0 && top==0);
Run Code Online (Sandbox Code Playgroud)

这告诉您该进程是否在其自己的控制台中启动,而不是它是否是资源管理器.在资源管理器中双击可以执行此操作,但是应用程序内的Start.Process()也会执行相同的操作.

如果要以不同方式处理这些情况,请使用此方法来了解父进程的名称:

  System.Console.WriteLine("Process id: {0}", Process.GetCurrentProcess().Id);
  string name = Process.GetCurrentProcess().ProcessName ;
  System.Console.WriteLine("Process name: {0}", …
Run Code Online (Sandbox Code Playgroud)

.net windows console console-application

19
推荐指数
3
解决办法
8026
查看次数

为什么VS2010"失去"我对构建的参考?

我已经开发了一个可以完成任务的类库,并使用单元测试对其进行了测试.库和测试构建并正常工作.然后,我在Windows服务项目中添加了解决方案,以便将库包装起来.

我添加了对我的类项目的引用,添加了一个using语句并从类lib中删除了一个对象.它的颜色编码很好,Refactor可以按住Ctrl键并导航到它,但是当我构建项目/解决方案时,它声称我的类型是未知的,并且有一个例外:

名称空间'MPN.Apollo'中不存在类型或命名空间名称'EmailLoaderCore'(您是否缺少程序集引用?)

这对我来说没有意义.我已经尝试删除引用,清理解决方案,重新创建引用,但没有快乐.我做错了还是VS2010很奇怪?

c# windows-services console-application visual-studio-2010

19
推荐指数
1
解决办法
1万
查看次数

SetConsoleCtrlHandler例程问题

我正在用C++编写一个控制台应用程序.

我使用SetConsoleCtrlHandler来捕获close和CTRL + C按钮.这允许我的所有线程停止并正确退出.

其中一个线程执行一些保存,需要一些时间来完成,我有一些代码在控制台crtl句柄例程中等待.MSDN指定CTRL_CLOSE_EVENT在5秒后弹出一个框,但我的进程退出.

这对于调试控制台应用程序也很烦人,因为在您可以单步执行之前进程退出并且我不知道可能是什么问题(我有Windows 7 64位).

另外,奇怪的是如果我的例程返回TRUE(只是禁用关闭操作),它仍然会关闭应用程序.该例程会被调用,因此SetConsoleCtrlHandler已成功安装.

例如:

BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
{
    if (dwCtrlType == CTRL_CLOSE_EVENT)
    {
        return TRUE;
    }

    return FALSE;
}

int _tmain(int argc, _TCHAR* argv[])
{
    BOOL ret = SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);

    while (true)
    {
        Sleep(1000);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ windows console-application

19
推荐指数
1
解决办法
2万
查看次数

Visual Web开发人员 - 控制台应用程序,如何

我正在学习可视化Web开发人员c#,实体框架和webservices.
我希望能够运行实体框架,例如不构建gui,或运行浏览器.所以吊点申请参考可以做到这一点.我可以在Visual Web开发人员解决方案中添加控制台应用程序吗?

谢谢

c# visual-web-developer console-application

19
推荐指数
1
解决办法
6905
查看次数

在New AppDomain中加载程序集而不将其加载到Parent AppDomain中

我试图将一个DLL加载到控制台应用程序,然后卸载它并完全删除该文件.我遇到的问题是,在自己的AppDomain中加载dll的行为会在Parent AppDomain中创建一个引用,因此不允许我销毁dll文件,除非我完全关闭程序.有关使此代码有效的任何想法?

string fileLocation = @"C:\Collector.dll";
AppDomain domain = AppDomain.CreateDomain(fileLocation);
domain.Load(@"Services.Collector");
AppDomain.Unload(domain);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我也尝试过这段代码而且没有运气

string fileLocation = @"C:\Collector.dll";
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation);

AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = Environment.CurrentDirectory;
domainSetup.ShadowCopyFiles = "true";
domainSetup.CachePath = Environment.CurrentDirectory;
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup);

//Load up the temp assembly and do stuff 
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer);

//Then I'm trying to clean up 
AppDomain.Unload(tempAppDomain);
tempAppDomain = null;
File.Delete(fileLocation); 
Run Code Online (Sandbox Code Playgroud)

.net c# appdomain console-application

18
推荐指数
1
解决办法
9538
查看次数

18
推荐指数
2
解决办法
4万
查看次数

如何编程禁用C#控制台应用程序的快速编辑模式?

我试过几个找到的解决方案,比如一个 - >

http://www.pcreview.co.uk/forums/console-writeline-hangs-if-user-click-into-console-window-t1412701.html

但是,我观察到GetConsoleMode(IntPtr hConsoleHandle,out int模式)中的模式对于不同的控制台应用程序将是不同的.它不是恒定的.

我是否可以在控制台应用程序上禁用鼠标单击(右/左按钮)以实现相同的方案.我发现它可以使用IMessageFilter完成,但仅适用于Window Form Application而不适用于控制台应用程序.

请指导.

c# console-application

18
推荐指数
3
解决办法
8658
查看次数

下载多个文件异步并等待所有文件完成后再执行其余代码

我试图从互联网上下载多个文件,等待所有这些文件完成.这是我正在运行的C#控制台应用程序,因此不需要任何进度条事件处理程序.但是,即使尚未下载所有文件,它目前仍继续执行代码.

  • 1.下载所有文件!
  • 2.完成下载文件A.
  • 3.Finished下载所有文件!
  • 4.Finished下载文件B.
  • 5.Finished下载文件C.

您将如何等待所有异步下载文件完成.

 private void DownloadMultipleFiles(List<DocumentObject> doclist)
    {
        foreach(var value in doclist){
            try
            {
                using (WebClient webClient = new WebClient())
                {
                    string downloadToDirectory = @Resources.defaultDirectory + value.docName;
                    webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                    webClient.DownloadFileCompleted += client_DownloadFileCompleted;
                    webClient.DownloadFileAsync(new Uri(value.docUrl), @downloadToDirectory);

                    //Add them to the local
                    Context.listOfLocalDirectories.Add(downloadToDirectory);
                }         
            }
            catch (Exception)
            {
                Errors.printError("Failed to download File: " + value.docName);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# download console-application async-await

18
推荐指数
1
解决办法
4万
查看次数

自定义控制台应用程序的标题栏区域

我可以自定义标题栏(即更改颜色)还是完全删除它?

c# windows winapi console-application

18
推荐指数
1
解决办法
2万
查看次数

实体框架6.1.1禁用模型兼容性检查

将EF更新到版本6.1.1后,我遇到以下错误:

EntityFramework.dll中发生了未处理的"System.InvalidOperationException"类型异常

附加信息:TvstContext自创建数据库以来,支持上下文的模型已更改.请考虑使用"代码优先迁移"来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269).

我们可以在这个问题中描述过去解决这个问题: EF CTP5中的modelBuilder.IncludeMetadataInDatabase在哪里?

但是,我似乎无法摆脱错误.

c# entity-framework console-application

18
推荐指数
2
解决办法
1万
查看次数