PDA

Ver la Versión Completa : cual es la carpeta de la ventana activa


chavetaz
30-12-2003, 22:33:06
hola a todos:
tengo una pregunta para los gurues de delphi:

como hago para saber a que directorio apunta la ventana del explorer (no IE) activa (la que esta mas al frente)?

tengo una aplicacion que se encuentra en background (system tray) y cuando la llamo con una hotkey quiero que me devuelva el directorio a cual apunta la ventana del explorer.

por ejemplo, tengo la ventana de la carpeta "c:\windows" al frente y presiono ALT-F1 y mi aplicacion tendria que devolverme "c:\windows".

creo que tengo que usar ShellFolders o ISHFfolder pero estoy perdido. :confused: :confused: :confused:

gracias totales.

Al González
31-12-2003, 03:07:39
¡Buen día a todos!

Chavetaz:

En caso de que el explorador de Windows tenga activa la opción Mostrar la ruta completa en la barra de título), podrías llamar a la función GetForegroundWindow para obtener el identificador de la ventana activa, y con él llamar a la función GetWindowText para obtener el texto que contiene como título.

Si la opción mencionada anteriormente está activa y el explorador de Windows es la aplicación enfocada, GetWindowText deberá regresar la ruta de directorio actual del explorador.

En caso de no ser el explorador de Windows la aplicación enfocada, podrías utilizar enumeración de ventanas (EnumWindows) para dar con la ventana del explorador (si es que está abierta una).

También podrías extraer el texto que contenga la barra de direcciones del explorador. Para dar con dicha barra podrías utilizar la funciones FindWindowEx o EnumChildWindows.

Sin embargo, considera que tratar de obtener la ruta del título o de la barra de direcciones, depende de que la opción mencionada al principio esté activa, o de que la barra de direcciones esté visible, respectivamente.

Finalmente, me parece haber visto en algún lugar ciertas funciones o interfaces shell, que podrían ser la solución adecuada a este caso.

Espero esto sea de utilidad. Seguimos en contacto.

Al González :).

delphi.com.ar
31-12-2003, 17:55:36
Sinceramente no me agrada mucho esa solución, y por eso buscaría alguna función tipo GetCurrentDirectory que te sirva para averiguar el Current Directory de otro proceso, en este caso el explorer. Estuve mirando rápidamente por la ShellApi, ShlObj, SHFolder... pero no encontré nada a simple vista.
El problema de mi propuesta, es que son suposiciones, no se si verdaderamente existe alguna función de este tipo.


Saludos!

marcoszorrilla
31-12-2003, 18:53:56
Yo estuve mirando un libro titulado - Los Tomos de Delphi - Nucleo del Api Win32 y no encuentro más que lo que apuntó Al González, por lo que mucho me temo que la respuesta sea una de esas funciones no documentadas a que nos tiene acostumbrados desde los tiempos del D.O.S. el fabricante del sitema operativo.

Un Saludo.

chavetaz
02-01-2004, 17:15:15
Antes que nada, Feliz año nuevo para todos!

Gracias Al González, delphi.com.ar y marcoszorrilla por sus opiniones y consejos.
Les comento que ya me estoy poniendo a investigar la opcion de la barra de titulo (estoy viendo la posibilidad de activarla por codigo), tambien voy a hacer algunas pruebas con GetCurrentDirectory para ver que sale de ello (estaba pensando que tal vez a medidad que vas activando una ventana del explorer, la carpeta asociada a dicha ventana pase a ser la activa, cosa que tambien seria una solucion).



:D

chavetaz
02-01-2004, 21:17:38
amigos:
Estuve investigando con el winsight y encontre la window que contiene la direccion de la carpeta a la que apunta la ventana, siendo asi la funcion GetWindowText me daria la ruta que necesito.
Ahora bien, que tendria que hacer para ubicar este objeto?, creo que es una child de la ventana que a su vez debe ser una child del windows explorer...

el arbol de ventanas del winsight es el siguiente:
- Overlapped 001F0474 {CabinetWClass} Explorer.EXE (405,243)-(1191,1047) "xUtilities" //este es el nombre de la ventana
-- Child 001604E8 {WorkerW} Explorer.EXE (0,0)-(778,86)
---- Child 001D0444 {ReBarWindow32} Explorer.EXE (0,0)-(778,86)
------ Child 00250428 {ToolBarWindow32} Explorer.EXE (734,64)-(774,86)
------ Child 001E04CC {ComboBoxEx32} Explorer.EXE (53,64)-(640,86) "D:\Archivos de programa\Borland\Delphi7\..."

La informacion detallada sobre ese objeto es:
Window Text: D:\Archivos de programa\Borland\Delphi7\...
Process ID
Window Handle
Parent Window
Class Name: ComboBox32Ex

Supongo que lo mas logico para obtener el path seria:
1- Obtener el nombre de la ventana en foreground
2- buscar esa ventana en la lista de preocesos u obtner su Handle
3- buscar el proceso hijo con ClassName "ComboBox32Ex" a partir del handle obtenido y obtener su handle.
4- Obtener el titulo del handle nuevo con la funcion GetWindowText.

Es esto factible o estoy divagando?

desde ya les agradezco mucho por su tiempo.

delphi.com.ar
02-01-2004, 21:56:48
chavetaz comentó:
1- Obtener el nombre de la ventana en foreground
Mmmmm... yo buscaría la ventana del proceso EXPLORER.EXE, mas arriba en el ZOrder... porque la "ForegroundWindow" no necesariamente sea del Explorer, puede ser de otro proceso.

Todo lo que nombras es factible, y cuando lo investigues te darás cuenta que es muy fácil de hacerlo, lo que no garantizo es que el usuario tenga configurado su explorer, como para que puedas obtener siempre este dato.

Saludos!

chavetaz
02-01-2004, 22:24:31
Ya lo tengo solucionado, las primeras pruebas parecen favorables, ejecuto el siguiente codigo y me devuelve el path de la ventana del windows explorer que tuvo el foco por ultima vez, o sea de cuatro ventanas de windows explorer abiertas me duvuelve la que estuvo mas al frente recientemente, seguramente se pueda optimizar el codigo pero basicamente es este:

function TForm1.GetPath: String;
var
win, toolbar, comboboxex, worker:hwnd;
begin
win := FindWindow(pchar('CabinetWClass'),nil);
worker := FindWindowEx(win,0,'WorkerW',nil);
toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
comboboxex := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
result := GetText(comboboxex);
end;

function TForm1.GetText(WindowHandle: hwnd): string;
var
txtLength : integer;
buffer: string;
begin
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);
txtlength := txtlength + 1;
setlength (buffer, txtlength);
sendmessage (WindowHandle,wm_gettext, txtlength, longint(@buffer[1]));
result := buffer;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(GetPath);
end;

muchas gracias a todos por su ayuda!