2016-12-26 8 views
1

Я разрабатываю крошечную пусковую установку. Его основная идея - исправить недостаток функциональности в Viber для Windows. Я хочу, чтобы это начало Viber сворачивалось только в лоток. Обычно, когда Viber запускается, на главном экране Viber появляется рабочий стол и значок - в системном трее. Все время я должен закрыть это устаревшее окно вручную. Итак, я написал несколько строк кода, но я обнаружил, что он все еще не мог закрыть окно:Как закрыть главное окно 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(); 
    } 
} 

Но все, что я попытался (Close, Dispose) - это не работает. Метод Убить не подходит, потому что он убивает всех. Но мне нужно только закрыть главное окно Viber и оставить процесс в системном лотке.

Существует и другой способ: чтобы начать Viber минимизированы сразу:

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(); 
    } 
} 

В таком случае мы получаем свернутое окно на TaskPane и значок в SystemTray. Но в этом случае я совершенно не знаю, как избавиться от значка (как закрыть свернутое окно) на панели задач.

Буду признателен за любую помощь/идеи в поиске решения этой проблемы.

ответ

0

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

Во-первых, импортирующие эти функции:

[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); 

И вы можете захотеть объявить WM_CLOSE константу:

const UInt32 WM_CLOSE = 0x0010; 

Затем код закрыть окно (но держать процесс запустив в фоновом):

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

Благодарим за короткий ответ. – Dmytro

+0

@Dmytro Нет проблем - вам удалось заставить его работать? – Bassie

+0

Я пытался использовать ваш код, но ничего не изменилось: начинается Viber, а затем его главное окно все еще остается открытым. – Dmytro

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

  • Нет связанных вопросов^_^