winuser.h


SetWindowLong

La función SetWindowLong modifica un atributo de la ventana especificada. La función también asigna el valor de 32 bits (long) en el desplazamiento especificado dentro de la memoria de ventana extra de la ventana.

Sintaxis

LONG SetWindowLong(
    HWND hWnd,      // manipulador de ventana
    int nIndex,     // desplazamiento del valor a asignar
    LONG dwNewLong  // nuevo valor
   );

Parámetros:

hWnd: identifica la ventana e, indirectamente, la clase a la que pertenece.

nIndex: especifica el desplazamiento, empezando en cero, del valor a asignar. Los valores válidos están en el rango de cero al número de bytes en la memoria de ventana extra menos 4; por ejemplo, si se sepecifican 12 o más bytes de memoria extra, un valor de 8 puede ser un índice para el tercer entero de 32 bits. Para asignar cualquier otro valor, especificar uno de los valores siguientes:

Valor Acción
GWL_EXSTYLE Asigna un estilo extendido de ventana nuevo.
GWL_STYLE Asigna un nuevo estilo de ventana.
GWL_WNDPROC Asigna una dirección nueva para el procedimiento de ventana.
GWL_HINSTANCE Asigna un nuevo manipulador de instancia de aplicación.
GWL_ID Asigna el nuevo identificador de ventana.
GWL_USERDATA Asigna el valor de 32 bits asociado con la ventana. Cada ventana tiene su valor de 32 bits correspondiente diseñado para su uso por la aplicación que la ha creado.

Los siguientes valores también están disponibles cuando el parámetro hWnd identifica a un cuadro de diálogo:

Valor Acción
DWL_DLGPROC Asigna una nueva dirección para el procedimiento de diálogo.
DWL_MSGRESULT Asigna el valor de retorno de un mensaje procesado por el procedimiento de diálogo.
DWL_USER Asigna nueva información extra que es privada para la aplicación, como manipuladores o punteros.

dwNewLong: especifica el nuevo valor a sustituir.

Valor de retorno

Si la función tiene éxito, el valor de retorno es el valore previo del entero de 32 bits especificado.

Si la función falla, el valor de retorno es cero. Para obtener información adicional sobre el error, llamar a la función GetLastError.

Si el valor previo del entero de 32 bits especificado era cero, y la función tiene éxito, el valor de retorno es cero, pero la función no elimina la última información de error. Esto hace difícil determinar si ha habido o no un fallo. Para poder determinarlo, se debe eliminar la última información de error mediante una llamada a SetLastError(0) antes de llamar a SetWindowLong. Entonces, si la función falla se indicará por el retorno del valor cero y porque el resultado de GetLastError será distinto de cero.

Observaciones

La función SetWindowLong falla si la ventana especificada por el parámetro hWnd no pertenece al mismo proceso que el hilo que la invoca.

Si se usa la función SetWindowLong y el índice GWL_WNDPROC para reemplazar el procedimiento de diálogo, el nuevo procedimiento de diálogo debe cumplir con las especificaciones de la guía para la función callback WindowProc.

Una llamada a SetWindowLong con el índice GWL_WNDPROC crea una subclase de la clase de ventana usada para crear la ventana originalmente. La aplicación no debe crear una subclase de una ventana creada por otro proceso. La función SetWindowLong crea una subclase de ventana cambiando el procedimiento de ventana asociado con una ventana en particular, haciendo que Windows llame al nuevo procedimiento de ventana en lugar del previo. La aplicación debe pasar cualquier mensaje no procesado por el nuevo procedimiento de ventana al procedimiento previo mediante una llamada a CallWindowProc. Esto permite a la aplicación crear una cadena de procedimientos de ventana.

Para reservar memoria extra para la ventana se debe especificar un valor no nulo en el miembro cbWndExtra de la estructura WNDCLASS usada con la función RegisterClass.

No se debe llamar a SetWindowLong con el índice GWL_HWNDPARENT para modificar la ventana padre de una ventana hija. En su lugar, suar la función SetParent.