2010-08-16 3 views
18

Я разрабатываю консольное приложение для своей публичной библиотеки в качестве школьного проекта. Консольное приложение будет запускаться сразу после входа пользователя в систему и выполнения некоторых фоновых работ.Создание невидимого консольного приложения

Дело в том, что я не хочу, чтобы консольное приложение действительно отображалось. Мне нужно, чтобы оно было невидимым. Последнее, что мне нужно, это жалобы, потому что некоторые люди испугались, что окно CMD открылось и закрылось, кроме того, библиотека хочет, чтобы он был невидимым, насколько это возможно.

Я попытался следующий код в этой теме: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd

, но безрезультатно, я все еще могу видеть консольное приложение поп открыть и закрыть после того, как он сделал все его работы.

Есть ли лучший способ остановить консоль? Благодарю.

+0

Вы пробовали мой код? Вы все еще сталкиваетесь с проблемами? – Searock

ответ

36

Лучшее, что нужно сделать, это просто не компилировать его в качестве консольного приложения! Скомпилируйте его как Windows EXE, и консоль не покажет. Затем вы можете просто сделать все, что вам нужно сделать в основном методе, не показывая пользовательский интерфейс.

Но в любом случае, если вы должны скрыть/показать окно консоли, я бы избежал использования FindWindow для этой задачи, так как для этого есть более надежный API: GetConsoleWindow. Это даст вам HWND окна консоли, и вы можете попробовать передать это в ShowWindow.

+1

Это было мое предложение. +1. – David

+0

+! для интуитивного стиля Microsoft ... – NinjaCat

+0

А, я вижу. Итак, что бы это было в «новом проекте» в Visual Studio? «Пустой проект»? Потому что я не вижу вариант для обычного .exe, только некоторых форм и консольного приложения. – Kratz

8

Вы пробовали: Свойства проекта> Приложение> Тип вывода: в "Приложение Windows"?

+0

Я только что сделал это, и теперь приложение сломано, оно предназначено для создания каталогов и копирования файлов из Embedded Resource, и теперь это не работает. :( – Kratz

2

Его немного сложнее, чем консольное приложение ... но если вы хотите, чтобы что-то действительно работало в фоновом режиме, когда кто-то входил в систему, вы можете создать приложение Windows Service.

Но это требует немного дополнительной работы в настройке и установке службы Windows, но есть изобилие примеров кода на веб-сайте:

http://msdn.microsoft.com/en-us/library/9k985bc9(v=VS.80).aspx

http://msdn.microsoft.com/en-us/library/sd8zc8ha(v=VS.80).aspx

http://www.c-sharpcorner.com/uploadfile/mahesh/window_service11262005045007am/window_service.aspx

http://www.developer.com/net/net/article.php/2173801/Creating-a-Windows-Service-in-NET.htm

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+1

Один из них заключается в том, что служба запускается до того, как пользователь войдет в систему и не привязан к определенной учетной записи пользователя. В зависимости от того, что вы делаете, это может быть полезно или вызвать головные боли. –

14

Как Josh Einstein предложил использовать ShowWindow Api, чтобы скрыть ваше окно.

Вот пример:

using System.Runtime.InteropServices 

class CommandLine 
{ 

    [DllImport("user32.dll")] 
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

    [DllImport("Kernel32")] 
    private static extern IntPtr GetConsoleWindow(); 

    const int SW_HIDE=0; 
    const int SW_SHOW=5; 

    static void Main(string[] args) 
    { 
     IntPtr hwnd; 
     hwnd=GetConsoleWindow(); 
     ShowWindow(hwnd,SW_HIDE); 

     //Your logic goes here 
    } 
} 

Я не уверен в этом коде, как я не проверял. Дайте мне знать, если у вас возникнут какие-либо проблемы.

+1

Это работает, но показывает короткая вспышка консольного окна при запуске процесса из другого процесса. – Wouter

2

Здравствуйте, я создавал консольное приложение, которое вызывается планировщиком задач. Я не хотел, чтобы консольное приложение отображалось, поэтому я изменил свойства проекта, чтобы получить выход в Windows Application.

Изменить тип выхода для приложения Windows, Перейти к: Проект -> Свойства проекта и изменить тип вывода в ОС Windows Application

0

Я попробовал оба метода 2) Searock, а затем 1) Джош --- с Searock-х решение окон консольного приложения все же появилось, хотя в течение очень короткого момента - однако с решением Джоша консоль не появилась и у моей программы не было никаких проблем - конечно, мне пришлось заменить все вызовы console.writeline с помощью вызов, который зарегистрировал информацию в файле журнала

Примечание: я бы просто прокомментировал решение Джоша, но я не могу сделать это шляпа совсем еще :)

Смежные вопросы