Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Editar Regedit de windows con Delphi 7.0 (https://www.clubdelphi.com/foros/showthread.php?t=59162)

BuRtOn 15-08-2008 02:13:57

Editar Regedit de windows con Delphi 7.0
 
Saludos amigos, mire lo que sucede es que necesito editar el regedit de windows y cambiar valores....por ejemplo, necesito cambiar el siguiente registro:

HEY_CURRENT_USER ---> Desktop ---> MenuShowDelay , cambiar el valor de MenuShowDelay que es por defecto 400 cambiarlo a 0, eso es lo que necesito hacer, y pude conseguir el siguiente codigo:

Código Delphi [-]
procedure DisableTaskMgr(bTF: Boolean);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.OpenKey('Software', True);
  reg.OpenKey('Microsoft', True);
  reg.OpenKey('Windows', True);
  reg.OpenKey('CurrentVersion', True);
  reg.OpenKey('Policies', True);
  reg.OpenKey('System', True);
  if bTF = True then
  begin
    reg.WriteString('DisableTaskMgr', '1');
  end
else if bTF = False then
  begin
    reg.DeleteValue('DisableTaskMgr');
  end;
  reg.CloseKey;
end;

No entiendo por que declaran ahi la variable bTF ??, si bien la puedo declarar en el uses, colocando var bTF :Bloean, bueno el hecho es que no se como modificar ese codigo para que me haga lo que yo deseo, alguien que me pueda colaborar por favor, pero que me colaboren al ejemplo que mensione anteriormente, Gracias.

FGarcia 15-08-2008 02:37:03

Hola!

bTF es una variable que debe recibir el procedimiento. Ese valor lo estan enviando cuando se llama a ese procedimiento desde otro punto de la aplicacion. ¿Recuerdas la estructura de arbol del registro? Bueno, pues si te fijas en el codigo que muestras recorren esa estructura y se posicionan donde necesitan cambiar el dato segun sea el valor de btF. Asi tu deberas recorrer la estructura hasta encontrar la clave que quieres cambiar. probablemente no sea necesario usar una variable como aqui pero eso lo deberas determinar tu en tu aplicacion.

BuRtOn 15-08-2008 02:47:36

Saludos, gracias por responder, bueno la prgeunta es, si declaro la variable como dije anteriormente si me funcionara ??, es que si la coloco en el procedure me enviara error de una vez, y pues ese es todo el codigo que tengo, se que tambien tengo que incluir el Ragistry en el uses...pero como hago para cambiar el valor de 1 a 0, como lo mencione en el ejemplo ???, por favor si me puedes especificar un poco mas, es que nunca he hecho esto, y solo quiero aprenderlo...Gracias amigo..

BuRtOn 15-08-2008 02:49:22

Oh lo olvidaba, tengo que colocar el codigo en algun evento en especial de la forma ?, o puedo colocar un boton y poner el codigo en el evento onclick del boton, para realizar la operacion cuando yo lo desee ???


Gracias por tu tiempo

Delphius 15-08-2008 02:56:37

Hola BuRtOn,
Aclarame una pregunta ¿Entiendes lo que es un parámetro?

BTF es el parámetro que espera dicho procedimiento para saber como y/o que hacer en base al valor suministrado. La forma en que se invoca al procedimiento es simple:

Código Delphi [-]
DisableTaskMgr(True); // O puede ser False

Con respecto a Tregistry sugiero que hagas una lectura de la ayuda. Para hacer el cambio que buscas se emplea el método WriteString. El segundo parámetro representa el valor a guardar (o cambiar), mientras que el primero es la clave a modificar. Y para ello necesariamente debe estar abierta dicha clave del registro. Lo cual se consigue invocando al método OpenKey.

Saludos,

BuRtOn 15-08-2008 03:02:10

Hola dlphius....pues mira esta es la primera vez que voy a hacer esto, y pues lo que basicamente quiero hacer es:

HEY_CURRENT_USER ---> Desktop ---> MenuShowDelay , cambiar el valor de MenuShowDelay que es por defecto 400 cambiarlo a 0, eso es lo que necesito hacer.


Pero no se donde ubicarme en el valor que trae por defecto ese registro, en este caso seria 400, y no se donde le coloco el nuevo valor que seria 0, eso es basicamente lo que no entiendo, no se donde colocar el valor por defecto y el valor que le voy a dar que seria 0...eso es basicamente lo que no entiendo, el resto de codigo si lo entiendo un poco mas...bueno gracias por tu ayuda, espero que me colabores..

Delphius 15-08-2008 03:22:18

A ver BuRtOn, por algo digo que leas la ayuda sobre TRegistry.

Tienes la clave de registro

HEY_CURRENT_USER\Desktop\MenuShowDelay

Bueno, empecemos a desarmar esta clave para que comprendas el porqué de cada método que ves en el código.

HEY_CURRENT_USER corresponde al ROOT. El directorio principal de la clave.

Luego le siguen los subdirectorios de la clave. En este caso es uno sólo: Desktop.

Y por último viene la variable, MenuShowDelay.

Cuando uno desea modificar una clave del registro debe abrir primero dicha clave. Esto se consigue con los siguientes pasos:

1. Establecer el root.

Código Delphi [-]
Reg.Rootkey := ....;

2. Abrir el/los directorio/s.

Aqui hay dos maneras, Si el subdirectorio tiene muchos subdirectorios debemos ir abriendolos uno por uno, o directamente los abrimos todos de una vez.

Por ejemplo,
Código Delphi [-]
Reg.OpenKey('software',True);
Reg.OpenKey('Microsoft',True);
Reg.OpenKey('Windows',True);

es equivalente a hacer:

Código Delphi [-]
Reg.OpenKey('software\Microsoft\Windows',True);

El segundo parámetro, que corresponde a un tipo boolean, es para indicar si debe crear el directorio en caso de no existir dicho directorio.

Una vez que todos los directorios han sido abiertos, ya podemos modificar la clave o variable que buscamos. Aqui dependerá si lo que guarda es string, integer, etc. Por ejemplo, supongamos que se guarda un string:

Código Delphi [-]
Reg.WriteString('DisableTaskMgr','1');

En el ejemplo, se cambia la variable DisableTaskMgr con el valor 1 pero en string.

Una vez hecho los cambios, hay que cerrar la clave.

Código Delphi [-]
Reg.CloseKey;

¿Se entiende ahora?

Es necesario que conozcas el registro de Windows. Al menos, lo que vas a modificar y/o leer.

Con respecto a cuando y donde hacer esto, dependerá de lo que se necesite. Puede ser en la primera vez que se va a usar el programa, y de allí en mas no debería hacer falta volver a hacerlo. Dije debería puesto que si se cambia el registro, en forma externa a tu aplicativo ya suenan las sirenas.

Puede ser ante la pulsación de un botón, en el evento OnCreate del form principal... esto ya es una cuestión de requisitos, de diseño del sistema y/o de implementación.

Saludos,

BuRtOn 15-08-2008 04:56:18

Código Delphi [-]
procedure DisableTaskMgr(bTF: Boolean);
  var reg: TRegistry;
begin  
  reg := TRegistry.Create;  
  reg.RootKey := HKEY_CURRENT_USER;  
  reg.OpenKey('Desktop', True);  
  reg.OpenKey('MenuShowDelay ', True);    
  if bTF = True then  begin    
    reg.WriteXXX(En las XXX va Int osea quedaria WriteInt)
    ('DisableTaskMgr', 1);  
  end else if bTF = False then begin    
    reg.DeleteValue('DisableTaskMgr');  
  end;  
  reg.CloseKey;end;

que pena, aki esta el codigo es que me salio a lo Ancho...

Delphius 15-08-2008 09:59:18

Hola BuRtOn,

Tengo para ti cuatro observaciones:
1. En el segundo OpenKey, estás pasando el texto con un espacio al final. Deberías quitar ese espacio.
2. Dudo que encuentres el directorio Desktop en HKEY_CURRENT_USER. Yo más bien diría que es HKEY_CURRENT_USER\Control Panel\Desktop.
3. El valor que se almacena en MenuShowDelay es un string.
4. ¿Tiene algún significado para ti el parámetro BTF? ¿Sabes lo que hace DeleteValue?

Esto te lo pregunto porque se me hace que copiaste código sin entender el porqué y de donde sale el parámetro BTF. Ese parámetro que ves en el procedimiento está para controlar alguna acción dentro del procedimiento del cual copiaste. Ahora, para ti, ¿que es ese BTF? Te sirve de algo? Porque si haces esto:

Código Delphi [-]
DisableTaskMgr(False);

Lo que conseguirás es eliminar dicha clave del registro (si existiese). ¿Deseas brindar la posibilidad de que se elimine y/o se escriba en el registro con un parámetro?

BuRtOn, Al menos hubieras dado un nombre adecuado al procedimiento, Para que no sea tan evidente que copiaste y solo lo editaste según lo que yo te dije:mad:.

Antes te pregunté si comprendías lo que es un parámetro. Di por entendido de que así era y que comprenderías que ese parámetro sólo es de interés para el que ha diseñado ese código. Que quieres te diga... a mi me huele a un simple Copy-Paste:(.

¿Leiste un poco la ayuda sobre el TRegistry? ¿Te fijaste si la clave en el registro está y de que tipo es? ¿O simplemente porque es un "número" intuías que verdaderamente se almacena un número?

Si ejecutaras el código que expusiste, conseguirías crear una clave DisableTaskMgr (en el caso de que BTF sea True) en HKEY_CURRENT_USER\Desktop\MenuShowDelay \ con un valor entero (si tu WriteXXX fuera WriteInteger) y no estarías modificando la clave adecuada.

Menos mal que antes te dije que conocieras la parte del registro con la que vas a trabajar:rolleyes:

En definitiva:

1. Establecer el root correcto.
2. Abrir el directorio Control Panel
3. Abrir el directorio Desktop
4. Escribir en MenuShowDelay el valor '0' (o el que se desee. ¡Poner antención al tipo por favor!)
5. Cerrar

Ahora si, espero que se entienda.
Saludos,

BuRtOn 15-08-2008 16:22:10

Hola delphius, Bueno como primer punto, no tengo por que disimular que copie el codigo, por que si no te diste cuenta yo recalque al principio de este hilo que el codigo me lo habia pasado un amigo, para que analisara las cosas, algo muy diferente a que me pusiera a mentir de que el codigo lo habia hecho yo.

Como segundo punto, no sabia a un 100% como se comportaria ese codigo en el Regedit de windows, por algo pregunte.

Tercer punto: Lamentablemente no tengo mucho tiempo que si diga para leer las cosas que a mi me interesan y deseo aprender, por mi estudio, y no solo eso, ahora nos enfocan a visual Basic 5.0, y tambien me toca estudiar.

Cuarto punto: Estudio Delphi aun por que me gusta y lo aprecio mucho, pero aveces no me queda tiempo.

Quinto punto: De igual forma te agradesco que me allas ayudado, va ser muy util tu ayuda, pero enserio, ya relajate un poco delphius y no me condenes a cadena perpetua sin antes leer bien lo que yo expongo en mis hilos, lo digo en cuanto a lo que dijiste que ubira disimulado que el codigo es copiado, a mi me gusta decir las cosas como son, no puedo aparentar que ese codigo es mio, por que por algo estoy preguntndo, no es apenas obvio ???..

Bueno Gracias, voy a intentar lo que me dijiste delphius, y sin broncas, gracias.:)

BuRtOn 15-08-2008 17:37:31

Saludos, Ok delphius gracias tus aportes fueron de gran ayuda, repase bien el codigo y pude lograr lo que queria, aqui esta el codigo como lo hice:

Código Delphi [-]
unit ufrmAumentarVelocidadMenu;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
begin
  reg:= TRegistry.Create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.OpenKey('Control Panel\Desktop\', True);
  reg.WriteString('MenuShowDelay','0');
  reg.CloseKey;
  MessageDlg('Su Menu Ha Sido Optimizado',mtInformation,[mbOK],0);
 end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
end.

Espero que a alguien le sea util...Bueno delphius ahora va esta pregunta, como hago el condicional, para que me haga lo siguiente:

* Por ejemplo voy a ejecutar la aplicacion para que me aumente la velocidad de mi menu de inicio de windows, que es basicamente cambiar el valor de 400 a 0, como esta en mi codigo, pero si alguien ejecuta mi aplicacion y ya han modificado el registro, osea ya no esta en 400 si no en 0, en pocas palabras necesito que me determine si el menu ya ha sido optimizado oh no, osea al ejecutar mi aplicacion que me determine si el valor 400 ya ha sido modificado a 0, para enviar un mensaje que me diga: "su equipo ya habia sido optimizado", espero que me puedas colaborar, y grcias ante mano.

Delphius 15-08-2008 17:51:48

Cita:

Empezado por BuRtOn (Mensaje 307815)
Saludos, Ok delphius gracias tus aportes fueron de gran ayuda, repase bien el codigo y pude lograr lo que queria, aqui esta el codigo como lo hice:

Código Delphi [-]unit ufrmAumentarVelocidadMenu; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg:= TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Control Panel\Desktop\', True); reg.WriteString('MenuShowDelay','0'); reg.CloseKey; MessageDlg('Su Menu Ha Sido Optimizado',mtInformation,[mbOK],0); end; procedure TForm1.Button2Click(Sender: TObject); begin Application.Terminate; end; end.


Espero que a alguien le sea util...Bueno delphius ahora va esta pregunta, como hago el condicional, para que me haga lo siguiente:

* Por ejemplo voy a ejecutar la aplicacion para que me aumente la velocidad de mi menu de inicio de windows, que es basicamente cambiar el valor de 400 a 0, como esta en mi codigo, pero si alguien ejecuta mi aplicacion y ya han modificado el registro, osea ya no esta en 400 si no en 0, en pocas palabras necesito que me determine si el menu ya ha sido optimizado oh no, osea al ejecutar mi aplicacion que me determine si el valor 400 ya ha sido modificado a 0, para enviar un mensaje que me diga: "su equipo ya habia sido optimizado", espero que me puedas colaborar, y grcias ante mano.

Una manera de hacerlo es leyendo dicha clave. Para eso en vez de WriteString, debes emplear ReadString. Tu aplición entonces, lo que puede hacer es el OnCreate de tu forma principal, leer el valor del registro y si no es igual a 400, lo cambia.

TRegistry cuenta con los métodos necesarios para leer, guardar, eliminar claves, para saber si existe alguna clave en particular o no... En estos momentos no tengo Delphi a mano, pero estoy seguro de que para leer el valor es ReadString.

El procedimiento es el mismo:
1. Establecer el root
2. Abrir directorios
3. Leer clave
4. Si el valor de clave leida es distinto a '0'
4.1. escribir en clave el valor '0'

Una vez que el TRegistry se ubica en una clave, se puede trabajar con ella. De modo que con solo abrir los directorios para leerlos ya no te haría falta volver a abrirlos para modificarlo. ¿Se entiende?

Sugiero que leas la ayuda sobre TRegistry. En serio, es preferible tomarse unos minutos para leer un poco y comprender mejor que intentar a ciegas.
Recuerda que el registro de Windows es un tanto sencible, una metedita de pata y ¡PUM! estallan pantallitas azules.

Saludos,

egostar 15-08-2008 17:53:36

Tendrias que preguntar por el valor de la clave,

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
begin
  reg:= TRegistry.Create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.OpenKey('Control Panel\Desktop\', True);
  if reg.ReadString('MenuShowDelay') = '400' then begin
     reg.WriteString('MenuShowDelay','0');
     MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
  end
  else MessageDlg('Su Menu ya estaba optimizado',mtInformation,[mbOK],0);
  reg.CloseKey;
end;

Salud OS

BuRtOn 15-08-2008 18:04:15

Saludos, ok entendi, pero ahora tengo un problema, jejeje, como se si mi registro es string o binary, o lo que sea es que no puedo editar esta clave:

[FONT='Book Antiqua','serif']HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\PrefetchParameters[/font][FONT='Book Antiqua','serif'].
Una vez alli aumentaremos el contenido del valor EnablePrefetcher del predeterminado "3" al recomendado "5".[/font]



[FONT='Book Antiqua','serif']Gracias por su ayuda...muy amables.[/font]

Delphius 15-08-2008 18:15:10

Si te fijas, al costado izquierdo muestra una pequeña imagen que dependiendo del tipo de dato muestra ab, numero binario, etc. Si vez binario es que el valor que se guarda es hexadecimal, binario o decimal; si vez un ab es un string, etc...

La tercera columna, muestra el tipo... es mejor mirar alli;)

Esto dice la ayuda:

REG_BINARY
Datos binarios sin procesar. La mayor parte de la información de los componentes de hardware se almacena en forma de datos binarios y se presenta en el Editor del Registro en formato hexadecimal.
REG_DWORD
Datos representados por un número de 4 bytes de longitud. Muchos parámetros de controladores de dispositivo y de servicios son de este tipo, y se presentan en el Editor del Registro en formato binario, hexadecimal o decimal.
REG_EXPAND_SZ
Cadena de datos de longitud variable. Este tipo de datos incluye variables que se resuelven cuando un programa o un servicio utiliza los datos.
REG_MULTI_SZ
Una cadena múltiple. Los valores que contienen listas o valores múltiples legibles suelen ser de este tipo. Las entradas están separadas mediante espacios, comas u otras marcas.
REG_SZ
Cadena de texto de longitud fija.
REG_FULL_RESOURCE_DESCRIPTOR
Serie de tablas anidadas, diseñadas para almacenar una lista de recursos para un componente de hardware o un controlador.

Un poquito de F1 no hace mal a nadie. Sino fíjate, ¿porque crees que Schumacher se retiró? ¿Porqué me estaba metiendo demasiado en la F1?;):D

Saludos,

BuRtOn 15-08-2008 18:36:00

Ok, pero donde consigo ejemplos de como editar cada uno, pues fijate el ejemplo que te di, la clave que no pude editar....Gracias delphius....es que no se como van los parametros paa editar un Integer, o un Boolean o Binary...el string ya lo se...Gracias de nuevo...

egostar 15-08-2008 18:37:53

Hola

Cita:

Empezado por Delphius
Un poquito de F1 no hace mal a nadie.

Salud OS

BuRtOn 15-08-2008 19:03:19

OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

egostar 15-08-2008 19:11:29

Cita:

Empezado por BuRtOn (Mensaje 307835)
OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

Vaya pues si que es dificil tu situación, de cualquier forma trata de traducir esta página.

http://www.swissdelphicenter.ch/torr...de.php?id=1665

Salud OS

Delphius 15-08-2008 19:18:46

Cita:

Empezado por BuRtOn (Mensaje 307835)
OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

BuRtOn, yo tampoco soy un experto, me cuesta un poco. Pero eso no es motivo para huirle. En esta profesión nos guste o no, hay que aprenderlo. Unas cuantas lecturas , escuchar el inglés y tratar de decir unas cuantas oraciones por día es un ejercicio recomendable. Al menos yo de vez en cuando lo hago: me siento a hacer mis diagramas en papel, prendo la TV,escojo algún canal en que estén hablando en inglés y evitando leer los créditos practico el odio y traducirlo mentalmente. Muchas veces la pifeo en la traducción, pero es algo.

Bueno, volvamos al tema: en la ayuda viene algunos ejemplos. Y si buscas sobre TRegistry en los foros encontrarás más. Allí verás, que al final en la "cabecera" sobre la ayuda en algunos métodos y/o propiedades del TRegistry aparece un "see also" y/o "example"

Saludos,


La franja horaria es GMT +2. Ahora son las 00:24:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi