2010-05-15 17 views
5

Aşağıdaki kod Internet Explorer 8'de bir sekmeyi kapatmıyor. Wm_close komutunu Wnd'ye gönderirseniz, Internet Explorer'ı kapatır ancak geçerli sekmeyi tüm 'ieframe' değil kapatmak istiyorum. FindWindowEX (Wnd, 0, 'Frame Tab', nil) bir çerçeveye bir tanıtıcıyı yeniden alması gerekiyor mu? Eğer evet ise, Internet Explorer'da mevcut sekmeyi neden kapatmıyor?ie8 sekmelerini kapatma

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

Bunun mümkün olduğundan emin değilim. –

+0

@George: Eh, * teoride * mümkün olmalı, IE8 sekmeler için gerçek pencereler oluşturuyorsa, bu muhtemel görünüyor. İşin sırrı, doğru pencere tanıtıcısını buluyor, ki bu da gerçekten de çok zor olabilir - ya da söylediğiniz gibi. :-) –

cevap

6
Bundan daha başka 1 katman, sekme kendisi, iyi olduğunu cevapsız

Aşağıdaki ekran görüntüsünde gösterilmektedir

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;` 

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
+0

Yanıt için teşekkürler Birkaç karışıklık var: 1. Neden hwnd yerine dword kullandınız? 2. htab'a eşit closehandle (htab): = nil 3. closehandle gerekli, programım çıktığımda tutamaçlar otomatik olarak kapatılmayacak mı? –

+1

Çok bozuk kod örneği. 1) FindWindow [Ex] sonucunu kontrol etmelisiniz. 2) FindWindow [Ex] tarafından döndürülen tutamaçları KAPATMAYIN. – gabr

+0

Aslında, bunun nasıl yapılması gerektiğine dair bir fikir göstermek ve düşünmek için biraz boşluk bırakmak (hata yakalama). Sapları kapatmama hakkında bilgi bulduğunuz yer (http://msdn.microsoft.com/en-us/library/ms633500(VS.85).aspx hiçbir şey söylemez)? Ve evet, WM_CLOSE alınan pencerenin kapanış kolu gerçekten istisna oluşturur (bu yüzden kapatmamıştım). – Im0rtality