2016-12-26 7 views
1

Ich entwickle einen winzigen Launcher. Seine Grundidee ist es, den Mangel an Funktionalität in Viber für Windows zu beheben. Ich möchte es Viber minimiert nur in den Tray zu machen. Normalerweise, wenn Viber gestartet wird, erscheint ein Viber-Hauptfenster auf dem Desktop und ein Symbol - in der Taskleiste. Die ganze Zeit sollte ich dieses veraltete Fenster manuell schließen. Also, ich habe ein paar Zeilen Code geschrieben, aber ich fand, dass es noch nicht das Fenster schließen konnte:So schließen Sie das Hauptfenster von Viber

using System; 
using System.Diagnostics; 

class ViberStrt { 
    static void Main() { 

     Process newProc = Process.Start("c:\\Users\\Dmytro\\AppData\\Local\\Viber\\Viber.exe"); 
     Console.WriteLine("New process has started"); 
     //newProc.CloseMainWindow(); 
     newProc.WaitForExit(); 
     newProc.Close(); 
     newProc.Dispose(); 
     Console.WriteLine("Process has finished"); 
     //newProc.Kill(); 
    } 
} 

Aber was auch immer ich versuchte (Close-up, Entsorgen) - es funktioniert nicht. Method Kill passt nicht, weil es alle tötet. Aber das einzige, was ich brauche, ist, das Viber-Hauptfenster zu schließen und den Prozess in der Taskleiste zu belassen.

Es gibt auch eine andere Art und Weise: Viber auf einmal minimiert zu starten:

using System; 
using System.Diagnostics; 

class LaunchViber 
{ 
    void OpenWithStartInfo() 
    { 
     ProcessStartInfo startInfo = new ProcessStartInfo("c:\\Users\\Dmytro\\AppData\\Local\\Viber\\Viber.exe"); 
     startInfo.WindowStyle = ProcessWindowStyle.Minimized;   
     Process.Start(startInfo); 
    } 
    static void Main() 
    { 
     //Process newProc = Process.Start("c:\\Users\\Dmytro\\AppData\\Local\\Viber\\Viber.exe"); 
     LaunchViber newProc = new LaunchViber(); 
     newProc.OpenWithStartInfo(); 
    } 
} 

In einem solchen Fall erhalten wir ein minimiertes Fenster auf dem TaskPane und ein Symbol in der SystemTray. Aber in diesem Fall habe ich absolut keine Ahnung, wie man das Icon (wie man das minimierte Fenster schließt) auf dem TaskPane loswird.

Ich freue mich über jede Hilfe/Ideen bei der Suche nach einer Lösung für dieses Problem.

Antwort

0

Mit Pinvoke können Sie versuchen, das Handle für das eigentliche Fenster zu bekommen, wenn Sie wissen, was die Fensterbeschriftung sein wird.

Zuerst importieren diese Funktionen:

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

Und Sie können die WM_CLOSE konstant erklären wollen:

const UInt32 WM_CLOSE = 0x0010; 

dann den Code, um das Fenster zu schließen (aber den Prozess halten die im Hintergrund laufen):

var startInfo = new ProcessStartInfo(@"c:\Users\Dmytro\AppData\Local\Viber\Viber.exe"); 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
var newProc = Process.Start(startInfo); 

var name = "Viber +381112223344"; 
var windowPtr = FindWindowByCaption(IntPtr.Zero, name); 

while (windowPtr == IntPtr.Zero) 
{ 
    windowPtr = FindWindowByCaption(IntPtr.Zero, name); 
} 

System.Threading.Thread.Sleep(100); 

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
+0

Vielen Dank für die kurze Antwort. – Dmytro

+0

@Dmytro Kein Problem - hast du es geschafft? – Bassie

+0

Ich habe versucht, Ihren Code zu verwenden, aber nichts hat sich geändert: Viber startet und dann bleibt das Hauptfenster geöffnet. – Dmytro

Verwandte Themen