2010-05-15 16 views
5

Este código a continuación no cierra una pestaña en Internet Explorer 8. Si publico el comando wm_close para Wnd, cierra Internet Explorer, pero quiero cerrar la pestaña actual, no toda la 'ieframe'. ¿Se supone que FindWindowEX (Wnd, 0, 'Frame Tab', nil) devuelve un manejador a ie frame? En caso afirmativo, ¿por qué no cierra la pestaña actual en Internet Explorer?cómo cerrar las pestañas ie8

var 
    Wnd, WndChild : hwnd; 
begin 
    Wnd := FindWindow('IEFrame', nil); 
    WndChild := FindWindowEX(Wnd, 0, 'Frame Tab', nil); 
    postmessage(WndChild, wm_close, 0, 0); 
end; 
+0

No estoy seguro de que esto sea posible. –

+0

@George: Bueno, en * teoría * debería ser posible, si IE8 está creando ventanas reales para las pestañas, lo que parece probable. El truco está en encontrar el asa de la ventana derecha, que puede ser muy difícil, o incluso imposible, como dijiste. :-) –

Respuesta

6

Se perdió 1 capa, la pestaña en sí, aparte de eso, estaba bien ..

var 
    Wnd, WndChild: THandle; 
begin 
    Wnd := FindWindow('IEFrame', nil); // Top most IE 
    if Wnd > 0 then 
    begin 
    WndChild := FindWindowEx(Wnd, 0, 'Frame Tab', nil); // Tabs holder 
    if WndChild > 0 then 
    begin 
     WndChild := FindWindowEX(WndChild, 0, 'TabWindowClass', nil); // top most tab 
     if WndChild > 0 then 
     if PostMessage(WndChild, WM_CLOSE, 0, 0) then 
      ShowMessage('Close request succeeded...') 
     else 
      ShowMessage('Failed!'); 
    end 
    else 
     // not tabbed, close IE 
     if PostMessage(Wnd, WM_CLOSE, 0, 0) then 
      ShowMessage('Close request succeeded...') 
     else 
      ShowMessage('Failed!'); 
    end 
    else 
    ShowMessage('No IE'); 
end; 
0
var 
    hie, 
    hftab, 
    htab : DWORD; 
begin 
    hie := FindWindow('IEFrame', nil); 
    hftab := FindWindowEx(hie, 0, 'Frame Tab', nil); 
    htab := FindWindowEX(hftab, 0, 'TabWindowClass', nil); 
    PostMessage(htab, WM_CLOSE, 0, 0); 
    CloseHandle(hie); 
end;` 
estructura

IE8 ventana se muestra en la siguiente captura de pantalla

alt text http://img171.imageshack.us/img171/6702/captureids.png

+0

gracias por la respuesta tengo algunas confusiones: 1. ¿Por qué usaste dword en lugar de hwnd? 2. es closehandle (htab) equivalente a htab: = nil 3. es necesario utilizar closehandle, ¿no se cerrarán automáticamente los controles una vez que se cierre mi programa? –

+1

Ejemplo de código muy malo. 1) Debería verificar el resultado de FindWindow [Ex]. 2) NO cierra los identificadores devueltos por FindWindow [Ex]. – gabr

+0

En realidad, esto era para mostrar una idea de cómo debería hacerse, dejando algo de espacio para pensar (error de captura). ¿Dónde encontraste acerca de no cerrar identificadores (http://msdn.microsoft.com/en-us/library/ms633500(VS.85).aspx no dice nada de eso)? Y sí, el identificador de cierre de la ventana recibida WM_CLOSE genera excepciones (por eso no lo cerré). – Im0rtality

Cuestiones relacionadas