Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Modificar Opciones de carpeta con delphi (https://www.clubdelphi.com/foros/showthread.php?t=70945)

maxinitto 20-11-2010 12:24:14

Modificar Opciones de carpeta con delphi
 
Hola:

Muy buenas, el caso es que he estado buscando como modificar las opciones de carpeta de windows mediante delphi....He visto aquí en algunos post que lo hacen mediante el registro pero claro no era lo que yo buscaba aunque si me ha orientado un poco... Bueno lo que yo quiero saber es, si se puede modificar tambien mediante el registro la opcion de dar un click o dos a la hora de abrir archivos o carpetas en windows. Tambien he leido que cuando cambias valores del registro respecto al explorer es necesario reiniciar el "explorer.exe", en caso de que fuese necesario me gustaria que me explicaran como hacer estos pasos.

Muchas gracias de antemano.

javier_ecf 20-11-2010 22:07:25

Nunca lo eh intentado pero para reiniciar explorer podrias matar el proceso y mandarlo abrir.
Ejemplos:

Ejecutar aplicacion:
ShellExecute(Handle, 'open', PChar('c:\test\app.exe'), nil, nil, SW_SHOW);

Matar proceso:
Código:

procedure KillProcess(hWindowHandle: HWND);
var
 
hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
 
SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);

  if isWindow(hWindowHandle) then
  begin
   
// PostMessage(hWindowHandle, WM_QUIT, 0, 0);

    { Get the process identifier for the window}
   
GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
     
{ Get the process handle }
     
processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
       
{ Terminate the process }
       
TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

Usarlo: KillProcess(FindWindow('notepad',nil));

maxinitto 21-11-2010 13:35:19

ok, muchas gracias.

por lo menos una de las cosas ya esta resuelta, la otra seria saber donde estan las entradas del registro del explorer.exe y alli alli pues iria probando ejjeej venga lo dicho muchas gracias :D

maxinitto 21-11-2010 14:12:43

Tambien he intentado monitorear el proceso explorer.exe y despues efectuado yo los cambios para que habra los archivos y carpetas con un click o dos, y me muestra tela de cosas que la mitad no entiendo jejeje si quereis probar aqui os dejo el proccess monitor y alguien que este mas metido en el tema intente localiza que valores modifica el explorer en el registro respecto al cambio que efectuamos.

Gracias de nuevo.

maxinitto 25-11-2010 15:17:05

Hola ya encontre donde se almacena esa clave de registro concretamente en la ruta: "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer" en la key "ShellState" si modificais la forma de abrir los archivos: con un click o dos, vereis que el valor de esa clave se modifica ademas lo e probado yo y funciona el caso es que este valor en cada pc es diferente y no se en que se basa pero bueno ya es algo mas jejeej cuando se modifica esta clave es necesario reiniciar el explorer o como bien dicen matarlo yo lo hice con este codigo:
Código Delphi [-]
uses
  Tlhelp32; 

(...)

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
y cuando lo hago los cambios surgen efecto, me queda averiguar en que se basa el valor que almacena para poder hacerlo que funcione en todos los pcs es para un programa que estoy elaborando.

Salu2


La franja horaria es GMT +2. Ahora son las 03:47:51.

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