Как получить хэндл главного окна через PID?

Тема в разделе "WASM.WIN32", создана пользователем Selah, 11 мар 2009.

  1. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    сабж
     
  2. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Открываем .NET Reflector и смотрим, как это сделано в CLR

    Код (Text):
    1. public IntPtr FindMainWindow(int processId)
    2. {
    3.     this.bestHandle = IntPtr.Zero;
    4.     this.processId = processId;
    5.     NativeMethods.EnumThreadWindowsCallback callback = new NativeMethods.EnumThreadWindowsCallback(this.EnumWindowsCallback);
    6.     NativeMethods.EnumWindows(callback, IntPtr.Zero);
    7.     GC.KeepAlive(callback);
    8.     return this.bestHandle;
    9. }
    10.  
    11. private bool EnumWindowsCallback(IntPtr handle, IntPtr extraParameter)
    12. {
    13.     int num;
    14.     NativeMethods.GetWindowThreadProcessId(new HandleRef(this, handle), out num);
    15.     if ((num == this.processId) && this.IsMainWindow(handle))
    16.     {
    17.         this.bestHandle = handle;
    18.         return false;
    19.     }
    20.     return true;
    21. }
    22.  
    23. private bool IsMainWindow(IntPtr handle)
    24. {
    25.     return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
    26. }
    В нативный код сам переведешь, я думаю?
    Не очень, конечно, способ смотрится, но есть ли лучше - фз.
     
  3. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    проще думаю есть метод
     
  4. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    а нету.. сделал так