2013-04-10 12 views
7

Ho bisogno di ripristinare ("non-minimizzare") una finestra WPF che è già stata creata ma la finestra attualmente in cima (non necessariamente WPF) non può perdere la messa a fuoco o l'attivazione. Ho provato a utilizzare tutte le funzioni WIN32 che riesco a trovare, senza alcun risultato. Essere veramente frustrati ora, apprezzerebbe davvero ogni suggerimento e suggerimento.Come ripristinare una finestra senza attivarla tramite WPF (o interop)

Ovviamente il passaggio a WindowState.Normal in WPF non lo interrompe poiché in questo modo la finestra riceve lo stato attivo e l'attivazione come bene. Ho anche provato tutti i tipi di combinazioni con l'impostazione Hidden e IsEnabled durante il ripristino.

Ho provato WIN32 SetWindowPos con HWND_TOP, HWND_TOPMOST ecc. Ma questa funzione non è pensata per ripristinare Windows e cambierà solo la posizione delle finestre già "visualizzate".

Provato WIN32 ShowWindow e SetWindowPlacement ma senza fortuna neanche. Ho provato un disperato tentativo di aggiungere un HwndHook per cercare di ascoltare WM_SETFOCUS e il ripristino attenzione alla finestra originale, ma ho solo zero per l'ultimo handle di finestra focalizzata ..

Edit - Soluzione con estensione finestra dopo la punta da Joel Lucsy :

public static class RestoreWindowNoActivateExtension 
{   
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool ShowWindow(IntPtr hWnd, UInt32 nCmdShow); 

    private const int SW_SHOWNOACTIVATE = 4; 

    public static void RestoreNoActivate(this Window win) 
    { 
     WindowInteropHelper winHelper = new WindowInteropHelper(win); 
     ShowWindow(winHelper.Handle, SW_SHOWNOACTIVATE); 
    } 
} 
+0

Puoi pubblicare il tuo codice attuale per favore? –

+0

Potrei postare il codice se senti che è necessario, ma dal momento che è solo un guaio di tentativi con chiamate diverse non è molto da guardare. Pubblicherò qualcosa se lo farò funzionare comunque .. – Niclas

risposta

6

chiamata ShowWindow passando la bandiera SW_SHOWNOACTIVATE.

+0

Ho davvero provato a realizzare questo superando tutte le combinazioni di parametri che potevo pensare. Ormai sono sicuro che SetWindowPos non può essere utilizzato per ripristinare una finestra, ma mi piacerebbe essere smentito :) – Niclas

+1

Che ne dici di ShowWindow con SW_SHOWNOACTIVATE? –

+0

+1 Ho modificato la risposta per includere la risposta corretta. Non ha senso lasciare la risposta originale lì che non funziona. –

Problemi correlati