2013-03-26 14 views
6

Vorrei scrivere l'applicazione C# che cambierà tra alcune applicazioni in esecuzione. Dovrebbe fare l'esatta funzionalità come Alt + Tab in Windows. Io uso la funzione SetForegroundWindow() dall'API di Windows, ma non funziona bene se l'applicazione è ridotta a icona sulla barra delle applicazioni di Windows. Così ho aggiunto la funzione ShowWindow(), ma c'è un problema che non sono in grado di mostrare la finestra nella dimensione originale impostata dall'utente.Passare l'applicazione in C# come task manager

[DllImport("user32.dll")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

Esempio: ingrandisco la finestra, quindi la minimizzo nella barra delle applicazioni. Quando chiamo:

ShowWindow(processWindowHandle, ShowWindowCmd.SW_NORMAL); 
WindowsApi.SetForegroundWindow(processWindowHandle); 

La finestra non è ingrandita. Ho provato a giocare con il parametro ShowWindowCmd.SW_NORMAL ma con lo stesso risultato.

+2

hai provato SW_RESTORE? – David

+0

Sì, ho provato SW_RESTORE. L'applicazione che è stata massimizzata e quindi ridotta al minimo viene quindi visualizzata NON massimizzata (come previsto). Viene mostrato come finestra la cui dimensione è inferiore alla dimensione massima dello schermo. –

+0

Non voglio massimizzare la finestra ogni volta. Voglio mostrare la finestra nello stesso stato che era prima che nascondessi la finestra con un'altra o prima di averla minimizzata nella barra delle applicazioni ... –

risposta

2

L'ho già fatto, si desidera ottenere un elenco di tutto ciò che è aperto, ridurre a icona tutto e quindi scorrere di nuovo quello confrontando nuovamente ogni programma con quello che si desidera ripristinare, quindi ripristinare quello. È necessario un modo per identificare quella finestra che si desidera ripristinare, ho usato il MainWindowTitle come se avessi il controllo sull'ambiente, e quindi potrei garantire che ogni MainWindowTitle sarebbe unico, potresti non avere quel lusso.

Il codice che ho usato in passato per questo è al di sotto, ha funzionato bene:

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

void SwitchDatabase(string mainWindowTitle) 
{ 
     try 
     { 
      bool launched = false; 

      Process[] processList = Process.GetProcesses(); 

      foreach (Process theProcess in processList) 
      { 
       ShowWindow(theProcess.MainWindowHandle, 2); 
      } 

      foreach (Process theProcess in processList) 
      { 
       if (theProcess.MainWindowTitle.ToUpper().Contains(mainWindowTitle.ToUpper())) 
       { 
        ShowWindow(theProcess.MainWindowHandle, 9); 
        launched = true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ThrowStandardException(ex); 
     } 
} 
+0

Hmm. Hai ragione, penso. C'è solo un piccolo svantaggio. Se non minimizzo la finestra e chiamo questo codice, la finestra massimizzata viene ripristinata nella dimensione NON minimizzata e NON massimizzata. Forse dovrebbe esserci un codice come questo: 'if (minimizzato) { ShowWindow (theProcess.MainWindowHandle, 9); } altro { SetForegroundWindow (processWindowHandle); } ' –

Problemi correlati