2009-02-18 2 views
24

У меня есть следующий класс заявил:Получение ручки окна в C#

public partial class MainWindow : Window 

И мне нужно, чтобы получить фактический дескриптор окна после того, как окно имеет один. Как это сделать и где я должен поместить функцию запроса.

То, что я пытался до сих пор было:

IntPtr hwnd = new WindowInteropHelper(this).Handle; 

Но ручка я вернусь 0, что может быть, потому что он был посажен в OnInitialized - может быть, окно еще не готова на этом этапе. И, да, это связано с WPF, спасибо за указание!

Благодаря

+0

WPF или winforms? –

+0

Можно ли предположить, что «WindowInteropHelper» имеет тип System.Windows.Forms.Form? –

+0

От их использования WindowInteropHelper, я думаю, что это WPF (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx) –

ответ

25

В OnInitialized методы ручки еще не была создана. Но вы на правильном пути. Если вы разместите свой звонок в событии Loaded, будет создан дескриптор и он должен вернуть правильную ручку.

0
[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern int FindWindowEx(int hwndParent, int hwndEnfant, int lpClasse, string lpTitre); 


int hwnd = FindWindowEx(0, 0, 0, title);//where title is the windowtitle 

       //verification of the window 
       if (hwnd == 0) 
       { 
        throw new Exception("Window not found"); 
       } 
+0

Mez, это работает для WPF? –

+3

В исходном посте плакат пытается получить дескриптор до его создания, поэтому этот метод также всегда терпит неудачу. Большинство параметров int должны быть IntPtr, на 64-битной платформе это будет неэффективно. Наконец, это будет искать только окна верхнего уровня. –

6

Самое раннее место, где вы можете получить ручку OnSourceInitialized

Смежные вопросы