Ho bisogno di accedere agli handle della finestra Win32 di alcune delle mie finestre WPF in modo da poter gestire i messaggi di attivazione di Win32. So che posso usare PresentationSource.FromVisual
o WindowInteropHelper
per ottenere l'handle della finestra Win32, ma sto incontrando problemi se la finestra WPF non è stata ancora creata.Forzare la creazione di un handle Win32 nativo della finestra WPF
Se utilizzo PresentationSource.FromVisual
e la finestra non è stata creata, il valore restituito PresentationSource
è nullo. Se utilizzo WindowInteropHelper
e la finestra non è stata creata, la proprietà Handle
è IntPtr.Zero
(null).
Ho provato a chiamare this.Show()
e this.Hide()
nella finestra prima di provare ad accedere all'handle. Posso quindi ottenere la maniglia, ma la finestra lampeggia momentaneamente sullo schermo (brutto!).
Qualcuno sa di un modo per forzare la creazione di una finestra WPF? In Windows Form questo era facile come accedere alla proprietà Form.Handle
.
Modifica: Ho finito per andare con una variante sulla risposta di Chris Taylor. Qui è, nel caso in cui aiuta a qualcun altro:
static void InitializeWindow(Window window)
{
// Get the current values of the properties we are going to change
double oldWidth = window.Width;
double oldHeight = window.Height;
WindowStyle oldWindowStyle = window.WindowStyle;
bool oldShowInTaskbar = window.ShowInTaskbar;
bool oldShowActivated = window.ShowActivated;
// Change the properties to make the window invisible
window.Width = 0;
window.Height = 0;
window.WindowStyle = WindowStyle.None;
window.ShowInTaskbar = false;
window.ShowActivated = false;
// Make WPF create the window's handle
window.Show();
window.Hide();
// Restore the old values
window.Width = oldWidth;
window.Height = oldHeight;
window.WindowStyle = oldWindowStyle;
window.ShowInTaskbar = oldShowInTaskbar;
window.ShowActivated = oldShowActivated;
}
// Use it like this:
InitializeWindow(myWpfWindow);
Hai visto questa domanda - http://stackoverflow.com/questions/1556182/finding-the-handle-to-a-wpf-window - potrebbe non essere d'aiuto in quanto non menziona se la finestra esiste già o no. – ChrisF
@ChrisF: Grazie! Sì, l'ho visto. Sfortunatamente, ha il problema con la finestra non ancora creata. –
Ho pensato di parlarne per ottenere una risposta in modo che se il tuo caso fosse diverso non sarebbe stato selezionato come duplicato. – ChrisF