2016-12-26 16 views
1

작은 런처를 개발 중입니다. 주요 아이디어는 Windows 용 Viber의 기능 부족을 해결하는 것입니다. 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(); 
    } 
} 

을하지만 (닫기, 폐기) 시도 무엇이든 -가 작동하지 않습니다. 메쏘드 킬은 모두 죽이기 때문에 적합하지 않습니다. 하지만 필요한 것은 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에있는 아이콘을받을 수는. 하지만이 경우에는 TaskPane에서 아이콘을 제거하는 방법 (최소화 된 창을 닫는 방법)은 전혀 모릅니다.

이 문제에 대한 해결책을 찾는 데 도움이 될만한 정보를 알려 주시면 감사하겠습니다.

답변

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