Red de conocimientos sobre prescripción popular - Remedios caseros - C Builder desarrolla salvapantallas en Windows

C Builder desarrolla salvapantallas en Windows

uno. Introducción

El salvapantallas del sistema Windows es una aplicación basada en línea de comandos. Cuando se invoca el protector de pantalla, el sistema operativo ejecuta el programa usando una línea de comando específica. Este artículo organiza y procesa todas las líneas de comando, incluidas "/p", "/s", "/c" y "/a", donde "/p" significa mostrar el protector de pantalla en la ventana de vista previa; ejecutar el programa de protección de pantalla; "/c" significa llamar al cuadro de diálogo de configuración y "/a" significa llamar al cuadro de diálogo de configuración de contraseña (no válido en WinNT); Este programa implementa un protector de pantalla completamente funcional de la forma más sencilla posible. Al ejecutar el programa de instalación del protector de pantalla de Windows, no solo puede cambiar la contraseña (no válida en WinNT), sino también configurar la frecuencia de visualización de la imagen y guardar el valor de frecuencia en el registro. Cuando el protector de pantalla se está ejecutando, la imagen cambia su posición de visualización con la frecuencia que establezca. También dejo una tarea para los lectores. Consulte el elemento para seleccionar la carpeta de imágenes en la Figura 1. Presione el botón Examinar para establecer la ruta a la imagen. El autor implementó la función del botón de exploración

Guarde la ruta del registro para que se pueda leer el valor de picdir cuando se inicie el protector de pantalla. El código cuando picdir es igual a "No" ha sido implementado por el autor, y el código cuando picdir es igual a "No" ha sido implementado por el lector. En otras palabras, permita que el lector implemente un protector de pantalla que pueda mostrar las imágenes en el directorio picdir en secuencia.

Dos. Método de implementación

Primero, introduzca varias funciones API.

Función WinMain:

int winapi winmain(instancia hinstanceh, //identificador de instancia actual.

HINSTANCE hPrevInstance, //identificador de instancia anterior

LPSTR lpCmdLine, //Puntero a los parámetros de la línea de comando (parámetros que se utilizarán en este programa)

Int nCmdShow //Estado de la ventana);

Función GetWindowLong: obtiene la ventana especificada función de información.

LONG GetWindowLong(HWND hWnd, //identificador de ventana/puerto.

Int nIndex //referencia/determina la información devuelta);

Función SetWindowLong: cambiar Propiedades de la ventana.

LONG SetWindowLong(HWND hWnd, //identificador de ventana/puerto.

Int nIndex, //Información que especifica el valor a establecer.

LONG dwNewLong / /new value);

Función SetParent: cambia la ventana principal de la ventana especificada.

HWND SetParent(HWND hWndChild, //Quiere/cambiar el identificador de ventana del formulario principal.

El identificador del formulario principal de HWND hWndNewParent // new/);< /p >

Función GetClientRect: Obtiene el área del cliente de la ventana.

BOOL GetClientRect(HWND hWnd, //identificador de ventana.

LPRECT lpRect //RECT/dirección de estructura);

Función SetWindowPos: cambia tamaño y posición, ventana de nivel superior, etc. ventanas.

Boolsettwindowpos (hwnd hwnd, //identificador de ventana.

Hwnd hwnd inserter, //Manejador para organizar el orden de las ventanas (orden Z)

int X, //Posición horizontal

int Y, //Posición vertical

int cx, // ancho

int cy, // alto

uintlags//posición de la ventana y otras etiquetas

); SystemParametersInfo Función: acceder o configurar parámetros a nivel del sistema.

boolsystemaparametersinfo(uintuaction, //Especifica los parámetros del sistema a obtener o establecer.

UINT uiParam, //Dependiendo de la acción a realizar

PVOID pvParam , //Dependiendo de la acción a realizar

uint fwini//Si el perfil de usuario cambia de flag);

Función ShowCursor: Muestra u oculta el cursor.

Int ShowCursor(BOOL bShow //Marca de visibilidad del mouse);

Función GetVersion: obtiene la información de la versión del sistema.

DWORD GetVersion(VOID)

Puede encontrar información detallada sobre las funciones API anteriores en la documentación de MSSDK. Después de comprender las funciones básicas, el autor describe brevemente el método de implementación.

1. Cree un nuevo proyecto, agregue dos formularios y nombre los tres formularios MainForm, FrmConfig y FrmControl respectivamente. Agregue el control Timer y el control TImage a los formularios MainForm y FrmControl respectivamente, establezca el BorderStyle de los dos formularios en bsNone y establezca el color de fondo en negro. Agregue una imagen al Timage de los dos formularios, establezca el tamaño de FrmControl en 130 píxeles de alto y 160 píxeles de ancho y establezca la propiedad Stretch de TImage en verdadero. El estilo de FrmConfig se muestra en la Figura 1.

2. Guarde el archivo del proyecto como screensaver.cpp y guarde otras unidades como Unitmain.cpp,

Unitcontrol.cpp, Unitconfig.cpp.

3. Escribir código. Para códigos específicos, consulte el programa fuente en la Parte 3.

4. Compílelo en un archivo ejecutable y cambie la extensión del archivo a scr.

5. Finalmente, copie el protector de pantalla al directorio de Windows para probarlo. Si todo está bien, sólo mira.

Hasta que la imagen se muestre en cualquier lugar de la pantalla.

Tres. Código fuente

El siguiente es el código fuente completo de este programa, del cual screensaver.cpp y Unitmain.cpp son los códigos principales.

/*{******************************}*/

/*{***** salvapantallas.cpp ****}*/

/*{************************ ** **********}*/

// - /

#incluye

#pragma hdrstop

USERES(" protector de pantalla . RES ");

USEFORM("Unitmain.cpp ", Frmmain);

USEFORM("Unitconfig.cpp ", frm config);< /p >

USEFORM("Unitcontrol.cpp ", control frm);

// - /

Winapi winmain (hinstance, hinstance, lpstr p, int)// "p" es un puntero a los parámetros de la línea de comando.

{ String StartType

AnsiString Command = p, temp

HWND CPWindow = NULL

if(Command== " ")

StartType = "/c ";

Otro

StartType = comando. Substring (1, 2); //Obtener los dos primeros parámetros de la línea de comando

Probar

{

Inicialización de la aplicación();

If(StartType=="/c")//Inicia la ventana de configuración.

formulario de creación de aplicación(_ _ classid(TFrmConfig), frm config);

De lo contrario, si(StartType=="/s ") inicia el protector de pantalla.

formulario de creación de aplicación(_ _ classid(TFrmmain), Frmmain);

Else if(StartType=="/p")//Vista previa

{

formulario de creación de aplicación(_ _ classid(control tfrm), control frm);

temp = comando. substring(3, command.length()-2); //Obtiene el formato de cadena del identificador de la ventana de vista previa del protector de pantalla en la línea de comando.

CPWindow =(long *)temperatura. ToInt(); //Fuerza la forma de cadena del identificador de la ventana de vista previa a un puntero entero largo.

RECT * look rect; //Crea un puntero de estructura RECT.

long STYLE = GetWindowLong(Application-MainForm-Handle, GWL _ STYLE); //Obtiene el estilo de la ventana FrmControl.

style = style | WS_CHILD

SetWindowLong(application-mainform-handle, GWL_style, style); //Establece la ventana como ventana secundaria

SetParent( application-main form-handle, ventana CP); //Establece la ventana de vista previa del protector de pantalla como la ventana principal de FrmControl.

GetClientRect(CPWindow, lookrect); //Obtiene el área del cliente de la ventana de vista previa del protector de pantalla.

SetWindowPos(Aplicación-formulario principal-Handle, HWND_TOP, 0, 0, lookrect-right, lookrect-bottom, SW

p _ sin zorder | SWP _ sin activar | SWP _ show window); //Superponga la ventana FrmControl en el espacio de trabajo de la ventana de vista previa del protector de pantalla y muéstrela.

}

Else if(StartType=="/a")//Inicia la ventana de configuración de contraseña.

{

temp = comando. substring(3, comando. length()-2);

CPWindow = (long *) temperatura. ToInt(); // El siguiente es el proceso de mpr.dll que llama dinámicamente a la función PwdChangePasswordA.

typedef UINT(CALLBACK * FUN)(LPSTR, HWND, UINT, UINT);

HINSTANCE hDll=LoadLibrary("mpr.

DLL");

DIVERSIÓN mifun

if(hDll!=null)

{

mifun=(FUN)GetProcAddress(hDll , " PwdChangePasswordA ");

if(!myfun)freelibrary(hDll);

Otro

myfun("SCRSAVE",CPWindow,0, 0) ; // Llamada a función

}

}

Application-Run();

}

catch (Excepción)

{

Aplicación-ShowException(Excepción);

}

Devuelve 0;

p>

}

// - /

/*{*************************** ** ********}*/

/*{*****

Página de inicio de la organización h

**** }* /

/*{************************************} */

// - /

#ifndef UnitmainH

#Definir mantenimiento de unidad h

// - /

#Incluye

p>

#incluye

#incluye

#incluye

#incluye

#incluye

#incluye

// - /

Clase TFrmmain: TForm público

{

_ _ Publicado: // Componentes administrados por IDE

TTimer * temporizador 1;

TImage * imagen 1;

void _ _ formulario de llamada rápida crear(al objeto * Remitente);

void _ _ tecla de formulario de llamada rápida (al objeto * Remitente, tecla WORD,

TShiftState Shift

void _ _ llamada rápida para); mousedown(al objeto * Remitente, TMouseButton Button,

TShiftState Shift, int X, int Y);

void _ _ fastcall FormCloseQuery(al objeto * Remitente, bool puede cerrar);

void _ _ llamada rápida cerrar formulario(al objeto * Remitente, TCloseAction Action

void _ _ llamada rápida imagen 1 mousedown(al objeto * Remitente,

<) p>Botón TMouseButton, TShiftState Shift, int X, int Y);

void _ _ llamada rápida imagen 1 movimiento del mouse(al objeto *Remitente, TShiftState Shift,

int

anular _ _ temporizador de llamada rápida 1 ti

mer(al objeto * Remitente);

Privado: //Declaración de usuario

DWORD PWProtect

Versión DWORD;

Cadena picdir

int frecuencia;

Público: //Declaración de usuario

_ _ llamada rápida TFrmmain(t componente * Propietario);

} ;

// - /

Paquete externo TFrmmain * Frmmain

// - /

#endif

// - /

/*{************************************ }*/

/*{***** Unidad principal.cpp

****}*/

/*{***** ******* *************************}*/

// - /

#incluye

#pragma hdrstop

#incluye

#incluye "Unitmain.h"

#incluye

// - /

#paquete pragma (smart_init)

#pragma recurso " *.dfm "

TFrmmain * Frmmain

// - /

_ _ llamada rápida TFrmmain::TFrmmain(t componente * Propietario)

{

}

// - /

void _ _ llamada rápida TFrmmain::form create(to object * Sender)

{

//Hacer que la ventana sea la ventana superior .

SetWindowPos(this-Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_no move | SWP_nosize);

//Cuando la ventana cubre la pantalla.

this-Width = ancho de pantalla

this-Height = altura de pantalla;

this-Top = 0

this- Left = 0;

version = GetVersion();

treg istry * Registro = nuevo registro;

Probar

{

if(versión 0x80000000){

clave raíz del registro = HKEY _current_user;

tecla abierta del registro("\Control Panel\Desktop", false);

pw protect = Registry-ReadInteger(" ScreenSaveUsePassword "); // Compruebe si está protegido con contraseña.

tecla de cierre de registro();}

clave de raíz de registro = HKEY _current_user;

tecla de apertura de registro(" \ Software \ code hunter ", true);

PicDir = Registry-ReadString(" PicDir "); //Obtener el directorio de imágenes

frecuencia = Registry-ReadInteger(" frecuencia "); en el que se muestra la imagen

if (picdir == " ") picdir = " no ";

if (frecuencia 0 | | frecuencia 6) frecuencia = 2; >

Temporizador 1 - intervalo = 1000 * frecuencia; configurar el temporizador

}#p#subtitle#e#

_ _last

{

Eliminar el registro;

picdir = " no

}

//Compruebe si se está ejecutando en NT.

If (version!=0)

If (pwprotectversion 0x 8000000)//Si el sistema requiere protección con contraseña y el sistema no es NT, configure el sistema en el estado de protector de pantalla y haga que el cursor desaparezca. /p>

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);

Y (!show cursor(false)-5);

}

// - /

void _ _ llamada rápida TFrmmain::form keydown(al objeto *Remitente, Tecla WORD,

TShiftState shift)

{

this-Close();

}

// - /

void _ _ llamada rápida TFrmmain::form mousedown(to objeto *Remitente,

Botón TMouseButton, TShiftState Shift, int X, int Y)

{

this-Close();

}

// - /

void _ _ llamada rápida TFrmmain::FormCloseQuery(al objeto *Remitente, bool CanClose)

{

if (PWProtect

versión 0x80000000)

{

bool PassChck

//Mostrar/mostrar cursor y cuadro de diálogo de contraseña de llamada caja.

And (!ShowCursor(True)

5);

//With/ es una llamada dinámica de la función VerifyScreenSavePwd.

typedef UINT(callback * FUN)(HWND);

h instancia hDll = LoadLibrary(" contraseña . CPL "); >

if(hDll!=null)

{

myfun=(FUN)GetProcAddress(hDll, "VerifyScreenSavePwd");

if (! myfun) Biblioteca gratuita (hDll);

Otro

PassChck = my fun(this-Handle);

}

if ( PassChck == false)

{

And (!ShowCursor(False)

-5);

CanClose = false< / p>

}

}

}

// - /

void _ _ llamada rápida TFrmmain::form close (para objetar * Remitente, operación TCloseAction)

{

And (!ShowCursor(True)

5);

if ( PWProtectVersion0x80000000)

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0); //Salir del estado del protector de pantalla

}

// - /

void _ _ llamada rápida TFrmmain::imagen 1 mousedown(al objeto *Remitente,

botón TMouseButton, TShiftState Shift, int X, int Y)

{< /p >

this-Close();

}

// - /

void _ _ llamada rápida TFrmmain::image 1 mousemove( al objeto *Remitente,

TShiftState Shift, int X, int Y)

{

static int MouseMoves = 0;

Mouse Move= movimiento del ratón