2011-06-03 15 views
7

yapabilirim Pinvoke kullanmam gerektiğini varsayarak, hangi işlev çağrılarının gerekli olduğundan emin değilim.Yönetilmeyen bir uygulama penceresini nasıl ön plana getirebilirim ve (simüle edilmiş) kullanıcı girişi için etkin pencereyi

Detaylı senaryo. Eski bir uygulama çalışıyor olacak. Bu uygulama için Sap tutacağım. Yapmam gerekenler: a) bu uygulamayı en üste getir (diğer tüm pencerelerin önünde). b) Etkin pencere yapınız.

Hangi pencere işlev çağrıları gereklidir?

[DllImport("user32.dll", SetLastError = true)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

Bu görev çubuğunu yapacaktır: Eğer uygulama penceresine bir kolu Şimdi varsayarak

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

: Eğer penceresi için bir tanıtıcı yoksa

cevap

11

, önce bu kullanma Başka bir pencerede klavye odağı varsa yanıp söner.

Pencereyi öne doğru zorlamak istiyorsanız, ForceForegroundWindow (örnek uygulama) kullanın.

+0

SetForegroundWindow I ("adlı 'ForceForegroundWindow' DLL 'user32.dll' bir giriş noktası bulunamadı.") –

+0

ForceForegroundWindow aramaya çalışıyor hatayı alıyorum ancak şimdiye kadar gerekenleri yapmak gibi görünüyor tıklayın Benim hatam, kullanıcı tarafından yapılmış bir işlev. Düzenlenmiş gönderi. –

+0

Benim durumumda buna ek olarak 'BringWindowToTop' kullanmak zorunda kaldım. ForceForegroundWindow, sorunumu güzelce çözdü. Teşekkürler! –

7

Bu, son derece güvenilir olduğunu kanıtlamıştır. ShowWindowAsync işlevi, farklı bir iş parçacığı tarafından oluşturulan pencereler için özel olarak tasarlanmıştır. SW_SHOWDEFAULT penceresinin gösterilmeden önce geri yüklendiğinden ve sonra etkinleştirildiğinden emin olur.

[DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool ShowWindowAsync(IntPtr windowHandle, int nCmdShow); 

    [DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool SetForegroundWindow(IntPtr windowHandle); 

Sonra arama yapmak:

ShowWindowAsync(windowHandle, SW_SHOWDEFAULT); 
ShowWindowAsync(windowHandle, SW_SHOW); 
SetForegroundWindow(windowHandle); 
+0

Denediğim diğer kodlar başarısızken çekicilik gibi çalışır. –

9
[DllImport("user32.dll")] 
    public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 
    [DllImport("user32.dll")] 
    public static extern bool SetForegroundWindow(IntPtr WindowHandle); 
    public const int SW_RESTORE = 9; 

ShowWindowAsync yöntemi minimize uygulamayı göstermek için kullanılır ve SetForegroundWindow yöntem arka uygulama cephesinde getirmek için kullanılır.

Uygulamamda kullandığım skype'ı getirmek için kullandığım gibi bu yöntemleri kullanabilirsiniz. butonuna

private void FocusSkype() 
    { 
     Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype"); 
     if (objProcesses.Length > 0) 
     { 
      IntPtr hWnd = IntPtr.Zero; 
      hWnd = objProcesses[0].MainWindowHandle; 
      ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE); 
      SetForegroundWindow(objProcesses[0].MainWindowHandle); 
     } 
    } 
+0

Teşekkürler. Zamanımı kurtardım. :) –

İlgili konular