2009-10-24 12 views
9

Mam na myśli, gdy użytkownik uruchamia moją aplikację (exe). Chcę, aby uruchamiał się bezpośrednio w zasobniku systemowym, bez pokazywania okna. Podobnie jak oprogramowanie antywirusowe & menedżerów pobierania, które cicho uruchamiają i uruchamiają w zasobniku systemowym.Jak uruchomić aplikację bezpośrednio w zasobniku systemowym? (.NET C#)

Chcę uzyskać ten sam efekt, a gdy użytkownik kliknie przycisk "pokaż" w contextmiintrip notifyIcon, wówczas tylko aplikacja powinna wyświetlać graficzny interfejs użytkownika.

używam tego, ale jej nie działa

private void Form_Load(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 

Może być muszę mieć funkcji main() w innej klasie, która nie ma GUI, ale ma notifyIcon & ContextMenuStrip którego opcja wystąpienia GUI klasa okna. Dobrze?

+0

Zobacz także to pytanie - http://stackoverflow.com/questions/807005/c-net-winforms-instantiate-a-forma-niez-showing-it – ChrisF

+0

Przepraszam za pogłębienie starego tematu. Mam wszystko oprócz jednej ważnej rzeczy. Rozumiem, że 'Application.Run()' zasadniczo zrzeka się kontroli (?). Chciałbym mieć kod robiący coś bez interakcji użytkownika (powiedzmy, że przetwarza dane i zapisuje je do pliku). Gdzie powinienem umieścić ten kod, aby był wykonywany, gdy program znajduje się w zasobniku systemowym? –

+0

@ BarryDysert: 'Aplikacja.Run() 'uruchamia pompę komunikatów Windows. Jeśli nie masz gdzieś tego połączenia, ikona na pasku nie będzie działać. Nie wiedząc nic o tym, co faktycznie próbujesz osiągnąć, powiedziałbym, żeby spojrzeć na wątki, tylko zdaj sobie sprawę z problemów modyfikujących rzeczy interfejsu użytkownika na wątkach innych niż ten, z którego wywołano 'Application.Run()'. –

Odpowiedz

27

Sposób, w jaki zwykle setup coś takiego jest modyfikacja Program.cs wyglądać mniej więcej tak :

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (NotifyIcon icon = new NotifyIcon()) 
     { 
      icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
      icon.ContextMenu = new ContextMenu(new MenuItem[] { 
       new MenuItem("Show form", (s, e) => {new Form1().Show();}), 
       new MenuItem("Exit", (s, e) => { Application.Exit(); }), 
      }); 
      icon.Visible = true; 

      Application.Run(); 
      icon.Visible = false; 
     } 
    } 

Używanie tego, nie trzeba się martwić o ukrywanie zamiast formy zamknięcia i cała reszta z hacków, które mogą prowadzić do ... można zrobić formę singleton zbyt zamiast uruchamianiu nowego Form co t kliknij przycisk opcji formularza. To jest coś, na czym można się oprzeć, a nie rozwiązanie końcowe.

+1

Jako kolejna uwaga, musisz używać projektu GUI, mimo że ten kod pojawia się przed pojawieniem się GUI, w przeciwnym razie pojawi się okno konsoli, które jest nawet gorsze niż pierwotny problem! –

+0

Awesome !! Właśnie tego szukam. Ale jak mogę zmienić ikonę.Icon? Chcę umieścić tutaj moją własną * .ico. zamiast wyodrębnić jeden. – claws

+1

'new System.Drawing.Icon (" C: \ Path \ To \ Icon.ico ")' z pamięci lub użyj zasobu (zalecane). Zobacz inne pytanie, aby uzyskać szczegółowe informacje na temat tworzenia/korzystania z zasobów: http://stackoverflow.com/questions/90697/how-to-create-and-use-resources-in-c-net-vs-2008 –

3

Należy również ustawić ikonę powiadomienia.

ręcznie lub za pomocą paska narzędzi (przeciągnij notifyIcon na formularzu) stworzenia notifyIcon:

this.notifyIcon = new System.Windows.Forms.NotifyIcon(components); 

następnie dodać ten kod do Form_Load():

// Notify icon set up 
notifyIcon.Visible = true; 
notifyIcon.Text = "Tooltip message here"; 
this.ShowInTaskbar = false; 
this.Hide(); 

choć będzie to, co zostało zauważyłem, krótko pokaż formularz przed jego ukryciem.

od przyjętych odpowiedź z this question, rozwiązanie wydaje się być zmiana:

Application.Run(new Form1()); 

do:

Form1 f = new Form1(); 
Application.Run();   

w Main().

+0

Właściwie mam konfigurację notifyIcon. Więc właśnie dodałem this.ShowInTaskbar = false; ale problem polega na tym, że okno wyświetla się przez chwilę, a następnie ukrywa się. Nie chcę tego. – claws

+0

Sprawdź moje rozwiązanie, a następnie pazury. To rozwiąże ten problem. –

+0

Czy próbowałeś ustawić 'WindowState' na' Zminimalizowany'? – ChrisF

0

Utworzono aplikację systemu Windows w języku C#? Musisz przeciągnąć formant NotifyIcon na formularz, kontrola zostanie umieszczona pod formularzem, ponieważ nie ma reprezentacji wizualnej na samym formularzu.

Następnie należy ustawić jego właściwości, takie jak ikona ...

najpierw wypróbować ten jeden ...

Powiązane problemy