2012-06-26 11 views

risposta

7

Penso che potrebbe essere necessario attendere fino a quando l'interfaccia utente non viene renderizzata fino a quando non si tenta di assegnare l'Hwnd. Prova a metterlo nel gestore eventi per Window.Loaded.

Questo mi è successo prima, ho avuto l'assegnazione Hwnd dopo InitializeComponent() è stato chiamato nel costruttore del code-behind. È sempre tornato a zero, cosa che potrebbe percepire quando sono passato e ho visto che l'interfaccia utente non era ancora apparsa. L'ho inserito nel gestore _Loaded e voilà, l'interfaccia utente esegue il rendering prima di colpire quella linea e all'improvviso "questo" ha smesso di essere nullo.

3

La risposta di WumpasTamer è corretta. Vorrei solo aggiungere un esempio di codice rapido per chiunque altro cerchi una soluzione "chiavi in ​​mano". Se utilizzi già WPF, non è necessario utilizzare lo standard window, ma se utilizzi Winforms e desideri utilizzare PresentationSource, dovrai utilizzarlo.

void Main() 
{ 
    var window = new Window 
    { 
     Width = 0, 
     Height = 0, 
     WindowStyle = WindowStyle.None, 
     ShowInTaskbar = false, 
     ShowActivated = false 
    }; 
    window.Loaded += a_Loaded; 
    window.Show(); 
} 

void a_Loaded(object sender, EventArgs e) 
{ 
    var s = (Window) sender; 
    var source = PresentationSource.FromVisual(s); 
    //... 
    s.Close(); 
} 
3

partire con .Net 4.0, è possibile accedere HwndSource senza dover visualizzare la finestra prima:

var helper = new WindowInteropHelper(this); 
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); 
+0

ho ancora ottenere nulla da 'PresentationSource.FromVisual' dopo aver chiamato' WindowInteropHelper.EnsureHandle'. Sembra che in realtà devo mostrare la finestra. 'FromVisual' deve richiedere altre cose interne che sono pigramente create, oltre l'handle. –

+0

Perché non usi 'HwndSource.FromHwnd' invece? –

+0

Perché ho bisogno della sorgente di presentazione per accedere alla destinazione della composizione per accedere alla matrice per accedere ai valori DPI. –

Problemi correlati