2010-04-14 12 views
5

Stworzyłem aplikację Windows Forms VB.NET w Visual Studio 2008. Kiedy uruchamiam mój program z wiersza poleceń, nie otrzymuję wyjścia (tylko następny monit).Console.Write nie działa w aplikacji Win Forms

Co robię źle?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Debug.Write("Foo") 
    Debug.Flush() 
    Console.WriteLine("foo") 
    Console.Beep(800, 100) 'confirm this function is called' 
    Me.Close() 
End Sub 

EDIT: Czy program posiada formę i konsoli?

EDIT2: Odpowiedź Ho działa. Jednak wynik pojawi się w następnym wierszu polecenia. Czy aplikacja Winforms może nakazać linii poleceń, aby poczekała do zakończenia, zamiast od razu zwracać?

+0

Czy robi coś, gdy jest uruchamiany bezpośrednio z programu Visual Studio? Ponieważ jest to odpowiedź na ładowanie i nie jest wywoływana, oznacza to, że Form1 prawdopodobnie nie jest tworzony. – Tarka

+0

Tak. Kiedy go uruchomię (z VS lub linii poleceń), słyszę krótki sygnał dźwiękowy. – Steven

+0

Znajdziesz dane wyjściowe z powrotem w oknie wyjściowym Visual Studio. –

Odpowiedz

2

Lub jeśli masz już WinForms Aplikacja umożliwia dołączenie do niej konsoli przy użyciu AttachConsole API.

using System.Runtime.InteropServices; 

...

[DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId); 
private const int ATTACH_PARENT_PROCESS = -1; 

...

AttachConsole(ATTACH_PARENT_PROCESS); 

(sformatowana jako kod)

+0

Wersja VB tego działa. Jednak dane wyjściowe pojawiają się po następnym wierszu polecenia. Próbuję teraz dowiedzieć się, jak zapobiec natychmiastowemu przywróceniu linii poleceń. – Steven

+1

Możesz zrobić polecenie "START yourapp.exe/WAIT", aby linia poleceń czekała, ale nie sądzę, że da to dokładnie to, czego chcesz. –

+0

Właściwie to działałoby dobrze. Dzięki! – Steven

1

Musisz utworzyć aplikację wiersza polecenia/konsoli zamiast aplikacji formularza Windows, aby użyć konsoli.

2

Spróbuj utworzyć nowy projekt, korzystając z szablonu "Aplikacja konsoli".

4

Inni mają rację, mówiąc, że musisz uruchomić aplikację jako aplikację konsolową. Do twojego pytania, czy możesz mieć konsolę i GUI: tak. Wystarczy dodać odwołanie do System.Windows.Forms do projektu, a dla Main metoda aplikacji, to ten kod:

' here instantiate whatever form you want to be your main form ' 
Dim f As New Form1 

' this will start the GUI loop, which will not progress past ' 
' this point until your form is closed ' 
System.Windows.Forms.Application.Run(f) 
9

Testowany podobnego kodu z C# .NET w systemie Windows formularz zgłoszeniowy. Wyjściowo i głośno brzmi w Visual Studio, ale tylko dźwięki po uruchomieniu w wierszu polecenia.

Jeśli zmienić typ Wyjście do Console Application pod Application karcie do właściwości projektu, mogę używać zarówno formy i konsoli :)

+0

to jest właściwa odpowiedź. nie używać współdziałania tylko dla konsoli .. –

+1

@Oren: Zmiana projektu na aplikację konsolową spowoduje na przykład wyłączenie przełącznika * Application Framework *. Co oznaczałoby, że OP musiałby napisać całkiem sporo kodu, aby zastąpić funkcjonalność, którą ten przełącznik dał mu za darmo. Tylko po to, aby uniknąć jednego połączenia wewnętrznego. Tak więc nie zgadzam się z tą jedną odpowiedzią, która jest lepsza od drugiej, nie znając więcej okoliczności związanych z PO. –

+0

@ ho1 Używając interopu, moja winform spawnuje nowe okno konsoli, które znika natychmiast po zakończeniu mojej aplikacji. To sprawia, że ​​integracja wiersza poleceń dla mojej winform jest dość nieczytelna, np. podczas pisania 'myApp.exe /?' miga okno konsoli, które znika natychmiast. Ponieważ nie mam zbyt dużego doświadczenia w korzystaniu z WinForm i szukania w Google 'tego, co jest ramą aplikacji ', zwraca zbyt ogólne wyniki, pytam Cię: Dlaczego potrzebuję tego * Application Framework *? – Nolonar

1

Roztwór:

Declare Function AttachConsole Lib "kernel32.dll" (ByVal dwProcessId As Int32) As Boolean 
Declare Function FreeConsole Lib "kernel32.dll"() As Boolean 

[kod .....]

w razie potrzeby na wyjście konsoli, które właśnie wywołuje AttachConsole (-1), ale pamiętaj, aby wykonać FreeConsole() na końcu programu.

jedynym problemem z tego rozwiązania jest to, że można przeczytać coś takiego:

C:> yourapp.exe
C:> Hello World!

Dzieje się tak, ponieważ aplikacja formularzy działa jako element podrzędny wiersza polecenia, więc monit zwraca natychmiast po wpisaniu nazwy aplikacji.

W aplikacji konsoli wiersz polecenia powraca po zakończeniu programu.

Nadal próbuję znaleźć sposób, aby zachować to samo zachowanie (przebieg synchronizacji), co w aplikacji konsolowej.

+0

Zrobić małe oszustwo i po prostu dodać 'Console.Write (String.Format (" {0}> ", AppDomain.CurrentDomain.BaseDirectory.TrimEnd (IO.Path.DirectorySeparatorChar))) na końcu. Cóż, działa tylko wtedy, gdy użytkownik ma domyślny monit ('$ P $ G'), ale zakładam, że zmieści się w 99,99% wszystkich przypadków. –

5

Można uruchomić aplikację z konsoli przy użyciu myApp.exe|MORE
ten sposób konsola pokaże Console.WriteLine() połączeń pochodzących z aplikacji i będzie czekać aż do zjazdu z aplikacji.
Proszę wybaczyć mój zły angielski.

+1

Działa świetnie! Dzięki za prostą odpowiedź. – CodeThug

Powiązane problemy