PDA

Ver la Versión Completa : Cómo simular el dragdrop de un fichero a un TWebbrowser?


cocute
16-10-2014, 10:18:03
alguno sabéis si se puede simular el dragdrop de un fichero a un TWebbrowser?
Por ejemplo partiendo de un filelist que al hacer dobleclick en un fichero se simule el dragdrop hacia el tbrowser sin tener que arrastralo?
no se si es muy complicado lo que pretendo o es una chorradita pero no encuentro info al respecto, o no se bien como buscarla
(encontré algo simulando clicks del ratón, pero seguro que hay un modo más simple)


gracias

cocute
16-10-2014, 22:14:46
Casi lo consigo con lo de simular clicks de ratón, pero no funciona


var
point:TPoint;
begin
getcursorpos(point); // guardo la posición del ratón
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);// click abajo
setcursorpos(800,point.y); //Me muevo a la derecha a la parte del webbrowser
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); // soltar click
setcursorpos(point.y,point.y); //vuelvo a donde estaba

luego en el dragover del twebbrowser pongo
accept:=true;

Pero no funciona como debería, me sale el tipico mensaje de que si quiero abrir o guardar el archivo,
algo no hago bien

ecfisa
17-10-2014, 08:10:39
Hola cocute.

Te hice un ejemplo simple (a modo de guía).

...
implementation

procedure TForm1.FileListBox1Click(Sender: TObject);
var
i, it: Integer;
o, d: TPoint;
begin
d:= WebBrowser1.ClientOrigin;
o:= ScreenToClient(Mouse.CursorPos);
it:= FileListBox1.ItemAtPos(o, True)-1;
o:= Mouse.CursorPos;
if it <> -1 then
begin
FileListBox1.BeginDrag(True);
i:= o.X;
repeat
SetCursorPos(i, d.Y +10);
Inc(i, 4);
Sleep(1);
until i > d.X+10;
Application.ProcessMessages;
FileListBox1.EndDrag(True);
Mouse.CursorPos:= o;
end;
end;

procedure TForm1.WebBrowser1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TFileListBox;
end;

procedure TForm1.WebBrowser1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
WebBrowser1.Navigate(TFileListBox(Source).FileName);
end;


Saludos :)

cocute
17-10-2014, 13:57:43
gracias, he probado pero no funciona,
hace lo mismo que había puesto de simular los cliks,
pero está claro que de un modo más elegante y mejor ya que no mueves el ratón para nada.

Al hacer click en los ficheros de la filelist me sale el mensaje de que si quiero abrir o guardar pero no hace lo que haces
cuando arrastras por ejemplo un fichero kml al navegador cuando está esta web abierta http://ivanrublev.me/kml/.
Igual es que no se puede hacer por temas de seguridad.
De hecho al compilar tu ejemplo el programa compilado me salta el antivirus kaspersky como de una actividad sospechosa.

ecfisa
17-10-2014, 17:18:51
Hola cocute.

El ejemplo funciona correctamente en Delphi 7 y Windows 7 32 bits, en cuanto al antivirus... Configuralo en la sensibilidad adecuada o reporta el falso positivo.

No te adjunto imágenes de la ejecución ya que no reflejarían el movimiento de Drag & Drop, pero sí los archivos fuentes que están funcionando correctamente y, de no mediar modificaciones en él, debería seguir haciéndolo.

Por último te aclaro nuevamente que es un ejemplo de como podrías implementarlo, una guía y no una solución concreta a tu problema del cuál desconozco todos los pormenores.

Saludos :)

nlsgarcia
17-10-2014, 17:25:34
cocute,


...De hecho al compilar tu ejemplo el programa compilado me salta el antivirus kaspersky como de una actividad sospechosa...
:rolleyes:

Te comento:

1- El código de Delphi esta tan optimizado a nivel de compilación que algunos antivirus detectan el ejecutable como un posible riesgo de seguridad.

2- Internet Security y Norton 360 también detectan posibles riesgos de seguridad con los ejecutables del Delphi 7, Delphi 2010 y Delphi XE6, asumo que lo mismo puede ocurrir con otras versiones de Delphi.

3- Revisa este código:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format('El ProcessID de la Aplicación es : %d',[GetCurrentProcessId]));
end;

El código anterior en Delphi 7, 2010 y XE6 es detectado por Norton 360 como : A program was behaving suspiciously on you computer. This program was removed. Threat name: SONAR.Heurist.120

Esto se debe a que la tecnología heurística de Norton 360 analiza la estructura y tipo de instrucciones del programa en Delphi y por su nivel de optimización y tipo de instrucciones determina una posible brecha de seguridad, sin embargo esto puede ser controlado a nivel de configuración en Norton 360, asumo que debe ser igual para Kaspersky Antivirus.

Espero sea útil :)

Nelson.

cocute
17-10-2014, 20:17:16
gracias por tu tiempo,
pero lo que pretendo no funciona,
para que lo veas mejor te pongo el código modificado, que has enviado para que veas que no simula exactamente el dragdrop al arrastrar un fichero kml,
en cambio si pruebas a arrastrar un kml de los que pongo desde el explorador de archivos a la ventana del twebbrowser verás que si lo acepta:

https://www.dropbox.com/s/hyd0m54ao2ok9n1/pruebadrag.zip?dl=0
(incluyo el exe)

ecfisa
17-10-2014, 20:34:43
Hola cocute.

Descargué y probé tu archivo. Sólo tuve que quitar del uses ", SHDocVw,system.Win.registry;" que no reconoce mi Delphi 7 y algo de código del evento OnCreate (que no hace al funcionamiento del Drag & Drop) quedando así:

procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.navigate('http://ivanrublev.me/kml/');
FileListBox1.Directory:= ExtractFilePath(Application.ExeName);
end;

y tál como lo esperaba, funciona correctamente:

http://sia1.subirimagenes.net/img/2014/10/17/141017082711520225.jpg

Así que el error debe estar el el código que te comenté, revisa esos puntos.

Saludos :)

cocute
17-10-2014, 20:41:55
El código del registro que pongo en el oncreate es para que pueda mostrar la web http://ivanrublev.me/kml/ correctamente en un webbrowser,
Todo este tema viene de este post:
http://www.clubdelphi.com/foros/showthread.php?t=86867

Al arrastrar el kml al webbrowser tendría que mostrar el mapa del fichero kml en la web,
no el código del kml.

No se si me explico bien?
Lo que pretendo que pase al hacer click en uno de los ficheros kml es esto:
https://www.dropbox.com/s/slfx3hh81jtju1f/Captura%20de%20pantalla%202014-10-17%2020.34.13.png?dl=0
https://www.dropbox.com/s/slfx3hh81jtju1f/Captura%20de%20pantalla%202014-10-17%2020.34.13.png

Pero lo que me ocurre, al menos en windows8 x64 es esto:
https://www.dropbox.com/s/wn5wf4bpt8ki6wd/Captura%20de%20pantalla%202014-10-17%2020.39.51.png?dl=0
Y si le doya a abrir me lo abre con el googleearth

ecfisa
17-10-2014, 20:55:34
Hola cocute.
El código del registro que pongo en el oncreate es para que pueda mostrar la web http://ivanrublev.me/kml/ correctamente en un webbrowser,
Todo este tema viene de este post:
http://www.clubdelphi.com/foros/showthread.php?t=86867

Al arrastrar el kml al webbrowser tendría que mostrar el mapa del fichero kml en la web,
no el código del kml.

No se si me explico bien?
Lo que pretendo que pase al hacer click en uno de los ficheros kml es esto:
https://www.dropbox.com/s/slfx3hh81jtju1f/Captura%20de%20pantalla%202014-10-17%2020.34.13.png?dl=0
https://www.dropbox.com/s/slfx3hh81jtju1f/Captura%20de%20pantalla%202014-10-17%2020.34.13.png

Pero lo que me ocurre, al menos en windows8 x64 es esto:
https://www.dropbox.com/s/wn5wf4bpt8ki6wd/Captura%20de%20pantalla%202014-10-17%2020.39.51.png?dl=0
Y si le doya a abrir me lo abre con el googleearth
Pero ese problema no es causado por la automatización del Drag&Drop, motivo inicial de este hilo...

Acabo de incluir en el evento OnCreate el código correspondiente al registro y quitar la automatización del Drag&Drop dejándola manual (del modo normal) y sigue mostrando código html.

Saludos :)

Edito: Leyendo el enlace que menciona Neftali me pregunto... ¿ No tendrá que ver si IE es el navegador predeterminado ?

cocute
17-10-2014, 21:11:30
Pero si arrastras un kml desde el explorador de archivos de windows a la ventana del navegador con esa web abierta que te ocurre?
igual es que hay que poner algo del tema OLE por algún lado.