53 votos

Cómo conseguir ventana principal de manejar desde el proceso de identificación?

Cómo conseguir principal identificador de ventana de proceso de identificación?

Quiero llevar esta ventana al frente.

Funciona bien en "Process Explorer".

47voto

Hiale Puntos 78

He comprobado cómo .NET determina la ventana principal.

Mi conclusión mostraron que también utiliza EnumWindows().

Este código debe hacerlo de manera similar a la .NET manera:

struct handle_data {
    unsigned long process_id;
    HWND best_handle;
};

HWND find_main_window(unsigned long process_id)
{
    handle_data data;
    data.process_id = process_id;
    data.best_handle = 0;
    EnumWindows(enum_windows_callback, (LPARAM)&data);
    return data.best_handle;
}

BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam)
{
    handle_data& data = *(handle_data*)lParam;
    unsigned long process_id = 0;
    GetWindowThreadProcessId(handle, &process_id);
    if (data.process_id != process_id || !is_main_window(handle)) {
        return TRUE;
    }
    data.best_handle = handle;
    return FALSE;   
}

BOOL is_main_window(HWND handle)
{   
    return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}

36voto

Jerry Coffin Puntos 237758

No creo que Windows (en contraposición a la .NET) proporciona una manera directa para conseguir que.

La única manera que conozco es a enumerar todos los de nivel superior de windows con EnumWindows() y, a continuación, encontrar lo que el proceso de cada pertenece a GetWindowThreadProcessID(). Esto suena indirectos e ineficientes, pero no es tan malo como se podría esperar, en un caso típico, usted podría tener una docena de nivel superior de windows para caminar a través de...

11voto

Dathan Puntos 4144

Existe la posibilidad de un mal entendimiento de aquí. El WinForms marco .Net designa automáticamente la primera ventana creada (por ejemplo, Application.Run(new SomeForm())) como MainWindow. La API de win32, sin embargo, no reconoce la idea de una "ventana principal" por proceso. El bucle de mensajes es totalmente capaz de manejar como muchos de los "principales" de windows como sistema y proceso de recursos le permitirá crear. Así, el proceso no tiene una "ventana principal". Lo mejor que puedes hacer, en el caso general es el uso de EnumWindows() para obtener todos los no-niño de windows activa en un proceso determinado y tratar de utilizar algunos heurística para averiguar cuál es la que usted desea. Por suerte, la mayoría de los procesos son sólo probabilidades de tener un único "principal" de la ventana de ejecución de la mayoría de las veces, así que usted debe conseguir buenos resultados en la mayoría de los casos.

2voto

AntonK Puntos 461

A pesar de que puede no estar relacionado con tu pregunta, echa un vistazo a GetGUIThreadInfo Función.

-1voto

Oliver Zendel Puntos 340

Sólo para asegurarse de que no están confundiendo el tid (id del hilo) y el pid (identificador de proceso):

DWORD pid;
DWORD tid = GetWindowThreadProcessId( this->m_hWnd, &pid);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X