2016-04-14 32 views
0

Çocuk pencerelerini (here veya here gibi smth) analiz ederek Outlook kullanıcı arayüzünü özelleştiriyorum ve Outlook ana penceresi görüntülendiğinde bunu yapmak zorundayım.Outlook 2013 ana penceresi görüntülendiğinde olayı tanımlayın (yükleme ekranı değil)

OnStartupComplete olay işleyicisinde Process.GetCurrentProcess().MainWindowHandle numaralı telefonu arayarak Outlook ana pencere işleyicisini alıyorum. Outlook 2007 ve Outlook 2010'da iyi çalışıyor olmalı, ancak 2013'te ilk önce açılış ekranı gösterilir ve bundan sonra tüm Gezginler ve Müfettişlerin bulunduğu ana pencere görüntülenir. Sorun şu ki, bu "açılış ekranı" görüntülendiğinde OnStartupComplete olayında ortaya çıkıyor, bu yüzden doğru işleyiciyi almıyorum.

    1. Bazı Explorer'ları Oturum Açma Explorer `ViewSwitch` olayı.
    2. Şerit `OnLoad` geri arama.
    3. Sekme `getVisible` geri arama.

Ne yazık ki hiçbir şey yardımcı olmamıştır. Hepsi, "splash screen" gösterildiğinde MainWindowHandle işaretlendiğinde ortaya çıkarlar.

MainWindowHandle, Outlook'un ana penceresini gösterdiğinde tetikleyici tanımlamanın herhangi bir yolu var mı?

+0

Süreç için geçerli olduğunu sanmıyorum - "mainwindow" başlığına kadar beklemesine rağmen "Outlook" metni çalışabilir – BugFinder

+0

Şerit düğmesini tıklatarak bunu çalıştırırsam (örneğin OL ana penceresi gösterildiğinde) . –

cevap

0

aşağıdaki yöntemini kullanan Outlook ana pencere kolu alır.

0

Biraz daha fazla araştırdım ve ana ekran penceresi "rctrl_renwnd32" nin, açılış ekranı gösterildiğinde oluşturulduğunu ancak görünmez olduğunu öğrendim. Böylece Sadece IOleWindow bir Explorer (Application.ActiveExplorer) ya da Inspector nesne döküm ve IOleWindow::GetWindow çağırabilir

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, IntPtr windowTitle); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int processId); 

    public static IntPtr GetOutlookMainHWnd() 
    { 
     int curtProcId = Process.GetCurrentProcess().Id; 
     int wndProcId = 0; 
     IntPtr olMainHWnd = IntPtr.Zero; 
     while (curtProcId != wndProcId) //this is to ensure that we get main window of our own process 
     { 
      olMainHWnd = NativeMethods.FindWindowEx(IntPtr.Zero, olMainHWnd, "rctrl_renwnd32", IntPtr.Zero); 
      GetWindowThreadProcessId(olMainHWnd, out wndProcId); 
     } 

     return olMainHWnd; 
    } 
İlgili konular