[C con Clase] Duda WinAPI

Salvador Pozo salvador en conclase.net
Lun Nov 22 21:02:46 CET 2010


El pasado 2010-11-22 16:38:54, Raúl escribió:
 
R> Buenas!
R>        Soy nuevo por aquí y no se exactamente como funciona esto. Espero que
R> sea así y podáis resolverme una duda que tengo. Gracias por adelantado.
R> Mi problema es que quiero mover una ventana ya existente, y parece facil con
R> MoveWindow. Mi pregunta es, como sé la entrada hwnd? Porque quiero mover la
R> ventana en la que esté el ratón en ese momento, no una que ya he creado de
R> la cual sé todo. No se si me explico bien, q ando un poco liado.

¡Uf!
Así como lo explicas no parece fácil, voy a intentar delimitar un poco el problema.

¿Tiene que ser la ventana sobre la que está el ratón, o la ventana activa (la que tiene el foco)?

Saber si el ratón está sobre una ventana específica es sencillo, pero hay que tener en cuenta que las ventanas se superponen, y que el ratón puede estar sobre muchas ventanas a la vez.

Te copio un pequeño programa que averigua sobre qué ventana están unas coordenadas concretas (en este caso 300,300).

----8<------
// Enlazar con la librería "gdi32"
#include <windows.h>
#include <wingdi.h>
#include <iostream>

using namespace std;

int main()
{
    HWND hwnd;
    char cad[256];
    RECT re;
    POINT p = {300, 300};
    bool encontrada=false;

    hwnd = GetTopWindow(0);

    do {
        if(ERROR != GetWindowRect(hwnd, &re)) {
            if(PtInRect(&re, p) && IsWindowVisible(hwnd)) {
                GetWindowText(hwnd, cad, 256);
                if(strlen(cad)) cout << "(" << re.left << "," << re.top << "," << re.right << "," << re.bottom << ") " << cad << endl;
                encontrada = true;
            }
        }
    } while(!encontrada && (hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)));
    return 0;
}
----8<------

Con algunas modificaciones (que las coordenadas las proporcione un evento del ratón), puedes adaptarlo a tus necesidades.

Básicamente lo que hace el programa es obtener el manipulador de la ventana "Top", es decir, la que esté más encima, verifica si las coordenadas están en el rectángulo de la ventana y si la ventana es visible.

Si es así, hemos encontrado la ventana que buscábamos.

Si no es así, buscamos la siguiente ventana según el orden Z. Windows mantiene una lista de ventanas, o más bien un árbol. En este caso sólo nos interesan las TOP windows, es decir, las que corresponden con aplicaciones o programas ejecutables. Hay otros órdenes, por ejemplo, las ventanas hijas de cada una de ellas.

Espero que te sirva.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase