Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-12-2003
chavetaz chavetaz is offline
Miembro
 
Registrado: oct 2003
Ubicación: Buenos Aires, Argentina
Posts: 29
Poder: 0
chavetaz Va por buen camino
Lightbulb cual es la carpeta de la ventana activa

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.

gracias totales.
Responder Con Cita
  #2  
Antiguo 31-12-2003
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡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 .
Responder Con Cita
  #3  
Antiguo 31-12-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 31-12-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 02-01-2004
chavetaz chavetaz is offline
Miembro
 
Registrado: oct 2003
Ubicación: Buenos Aires, Argentina
Posts: 29
Poder: 0
chavetaz Va por buen camino
Thumbs up

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).



Responder Con Cita
  #6  
Antiguo 02-01-2004
chavetaz chavetaz is offline
Miembro
 
Registrado: oct 2003
Ubicación: Buenos Aires, Argentina
Posts: 29
Poder: 0
chavetaz Va por buen camino
Thumbs up

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.

Última edición por chavetaz fecha: 02-01-2004 a las 20:19:49.
Responder Con Cita
  #7  
Antiguo 02-01-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 02-01-2004
chavetaz chavetaz is offline
Miembro
 
Registrado: oct 2003
Ubicación: Buenos Aires, Argentina
Posts: 29
Poder: 0
chavetaz Va por buen camino
Lightbulb

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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:41:34.


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
Copyright 1996-2007 Club Delphi