Answered by:
IE7 Tabs

Question
-
I am looking for a way using the SendMessage API or something along those lines to activate a different Tab from an external application, so I can detect if a URL is already open and restore that instance of IE and automatically switch to the proper tab.Thursday, September 7, 2006 5:35 AM
Answers
-
Hi Michael,
There are not specific APIs for automating tabs in IE7. You can you accessibility APIs to activate different tabs. We are looking at this area for future development and it would help to understand exactly what you'd liek to see here.
Thanks
-DaveMonday, September 11, 2006 4:51 PM
All replies
-
Hi Michael,
There are not specific APIs for automating tabs in IE7. You can you accessibility APIs to activate different tabs. We are looking at this area for future development and it would help to understand exactly what you'd liek to see here.
Thanks
-DaveMonday, September 11, 2006 4:51 PM -
What I would like to see is the ability to list all open tab URLS and page titles, and the ability to activate the different tabs. Even if it is not coded directly as an API just information on what is the best way to do this. Currently I am developing an add on application to a product my company sells that opens the users current instance of IE if they are on the correct page or launches a new one if they are not. Currently I list all windows in the thread of IEXPLORE and if the window does not contain the title I am looking for then I enumerate its children, if I find the match there I will open that instance of IE but I can not change the tab for the user they must click that themselves. When I am able to bring that active Explorer up but it causes problems within IE itselfs because it does not have that as being the active tab so you are unable to click on anything you see on the page. Any help on activating a different tab as a quick fix would be of great help.Monday, September 18, 2006 3:12 PM
-
I also want to know how to switch to the specified tab in IE7 without clicking action.Tuesday, October 24, 2006 8:28 AM
-
How can you count the number of tabs open?Thursday, October 26, 2006 7:56 PM
-
I want to activate the tab as well.
I am printing document , it works fine with IE 6 but when it comes to IE 7 it prints all tabbed windows open in my current IE instance.
What I want is , I want to print only currently active TAB.
Please help me.
Tuesday, November 14, 2006 4:46 PM -
Hi, the SPYXX utility (VS.net>Tools menu) lists the windows heiarchy under the top container (in IE7's case classname="IEFrame") under which are the windows with a classname of TabWindowClass, so to count the number of open tabs enum the windows under the top IEFrame window and count those with a classname of TabWindowClass.
You should be able to use the same method to locate and activate a non-active tab, though I have not tried this method myself... maybe the SendMessage api (though there are no documented WM values for show tab) or maybe the ShowWindow api.
Regards.
Wednesday, November 22, 2006 4:14 AM -
I have the exact same problem!
I can get the last opened TAB, but that doesn't help me much:(I'll subscribe to this post to see if you get a solution.. I hope!
Thursday, January 11, 2007 8:40 AM -
I would like to see a way to save a TAB GROUP and then go to Favorites->TAB GROUPS->my group and reopen all the tabs that I had saved in that group (I watch several codeplex projects of mine as well as several msdn forums, when my son reboots because his game crashes I have to manually open all those sites again:(
Tuesday, January 16, 2007 10:42 PM -
Clyde,
I thought that was a good idea...so I spent the day writing a band object that launched tab groups from favorites.
Then I looked in IE 7 favorites...it already has this feature! lol.
Friday, January 19, 2007 1:00 AM -
Hi CableHead,
If you are looking for a job, I am afraid that I can't offer you one... hell I need one too.
What I would like to proposition you with though is a combined effort to write a BHO for IE6 and IE7 in C++ or ATL. It would require a moderate skills level in either one of these languages and also some API and Callback usage.I already have an established customer base and a web site http://www.iecustomizer.com and could offer you a cut of the sales in return for your efforts. This may turn out to be a practicle use of your idle time.
Initially please go to http://www.iecustomizer.com/?url=contact.asp and send us your contact details (email, Messenger ID, ICQ or Yahoo Messenger ID's) so that we can establish a dialog.
Regards.
Friday, January 19, 2007 10:18 AM -
I used the feature in favorites to add a tab group to my favorites, but I see no way to open a tab goup. That is, open all tabs in a group (that was saved in favoties) at once with one click of a menu item.Friday, January 19, 2007 1:18 PM
-
IECUST...
Would have to be C#.
Friday, January 19, 2007 1:40 PM -
Clyde...
Wow...your right. Looks like I'll finish it then. One click is the only way to go.
Friday, January 19, 2007 1:43 PM -
COOL :) !Friday, January 19, 2007 9:39 PM
-
Hi Clyde,
All you have to do is click on the arrow that appears towards the right of your folder's name when you hover over it with your mouse. That will open all the bookmarks contained in the folder in different tabs.
Regards,
Mauricio
Friday, January 19, 2007 10:19 PM -
I have IE version 7.0.5730.11 and clicking on the arrow to the right of the tab group name in favorites does not open anything but the menu item list showing the links to the web sites that I saved as a group. It doesn't open any tabs at all :(. I must be missing something.Saturday, January 20, 2007 5:48 AM
-
Cablehead, did you ever get it working?Monday, January 29, 2007 6:33 AM
-
Clyde...yes I do have a working version. Now working on a way to close all open tabs before navigating to another "group".Monday, January 29, 2007 10:29 AM
-
I look forward to it, cablehead :)
It's a drag opening up 7 or 8 tabs to get to my codeplex projects and the msdn forums that I watch.
Tuesday, February 6, 2007 6:12 PM -
Clyde...if your tired of clicking...send me a mail yaylindsay@hotmail.com if you would like to check it out.Wednesday, February 7, 2007 2:56 AM
-
Create internet shortcuts to all of your favorite forums and feeds and place them into a folder in your Favorites. When you hover your mouse over the folder, an arrow to the right side will come up. If you click on this arrow all the links inside the folder will open in separate tabs. You can also right click on the folder and select "Open in Tab Group"Wednesday, February 14, 2007 12:26 AM
-
Hi,
I just found solution. Spicific IE7 tab can be set as active via Active Accessability !
This is my very very first experemental but !!!WORKING!!! code !
I write it under BDS 2006, but it's must work under Visual studio to.
I hope it's helps:
void __fastcall TForm1::ActivateTab(TObject *Sender)
{
HRESULT hRes;
HWND MainIEWnd;
HWND CommandBarWnd;
HWND ReBarWnd;
HWND TabBandWnd;
HWND DirectUIWnd;
BSTR tabCaption;
long TabsCount=0,TabsReceived=0,newRes;
IAccessible *tabsAccess,*tabObject,*newObj;
IDispatch *tabDisp,*tab1;
VARIANT ChildStruct[10],tabStruct[10],tabQueryStruct,tabResStruct;
tabQueryStruct.vt=VT_I4;
tabQueryStruct.lVal=CHILDID_SELF;
/*
IE7 windows tree:
IEFrame
|
--CommandBarClass
|
--ReBarWindow32
|
--TabBandClass
|
--DirectUIHWND <<<<< IE 7 Tabs here !!!
*/
MainIEWnd=FindWindow("IEFrame",NULL);
if(!MainIEWnd)
{
ShowMessage("DEBUG: Unable to find main IE window");
return;
}
CommandBarWnd=FindWindowEx(MainIEWnd,NULL,"CommandBarClass",NULL);
if(!CommandBarWnd)
{
ShowMessage("DEBUG: Unable to find CommandBarWindow");
return;
}
ReBarWnd=FindWindowEx(CommandBarWnd,NULL,"ReBarWindow32",NULL);
if(!ReBarWnd)
{
ShowMessage("DEBUG: Unable to find ReBarWindow32");
return;
}
TabBandWnd=FindWindowEx(ReBarWnd,NULL,"TabBandClass",NULL);
if(!TabBandWnd)
{
ShowMessage("DEBUG: Unable to find TabBandClass");
return;
}
DirectUIWnd=FindWindowEx(TabBandWnd,NULL,"DirectUIHWND",NULL);
if(!DirectUIWnd)
{
ShowMessage("DEBUG: Unable to find DirectUIHWND");
return;
}
if(AccessibleObjectFromWindow(DirectUIWnd,OBJID_CLIENT,IID_IAccessible,(void **)&tabsAccess)!=S_OK)
{
ShowMessage("DEBUG: Unable to get IAccessible interface");
return;
}
hRes=tabsAccess->get_accChildCount(&TabsCount); // get objects count
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: Unable to get Objects count");
return;
}
hRes=AccessibleChildren(tabsAccess,0,TabsCount,ChildStruct,&TabsReceived);
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: Unable to get objects");
return;
}
for(int i=0;i<TabsReceived;i++) // enum objects
{
if(ChildStruct.vt==VT_DISPATCH)
{
tabDisp=ChildStruct.pdispVal;
hRes=tabDisp->QueryInterface(IID_IAccessible,(void **)&tabObject);
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: QueryInterface to tabObject failed");
continue;
}
hRes=tabObject->get_accRole(tabQueryStruct,&tabResStruct);
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: Unable to receive object role");
continue;
}
if(tabResStruct.lVal!=ROLE_SYSTEM_PAGETABLIST) // we need only PageControl ! skip
continue; // another contorls
tabsAccess=tabObject; // we found PageControl with IE7 tabs !
hRes=tabsAccess->get_accChildCount(&TabsCount); // number of opened tabs + New Tab button
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: tab count failed");
continue;
}
hRes=AccessibleChildren(tabsAccess,0,TabsCount,tabStruct,&newRes);
for(int j=0;j<newRes;j++) // enum tabs
{
tab1=tabStruct[j].pdispVal;
hRes=tab1->QueryInterface(IID_IAccessible,(void **)&newObj);
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: QueryInterface to newObj failed");
continue;
}
hRes=newObj->get_accName(tabQueryStruct,&tabCaption);
if(!SUCCEEDED(hRes))
{
ShowMessage("DEBUG: Unable to receive tab caption");
continue;
}
if(tabCaption==L"your specific string")
// make this f..g tab active !!!!
newObj->accDoDefaultAction(tabQueryStruct);
}
}
}
}
//---------------------------------------------------------------------------- Proposed as answer by nayR_Inverted Saturday, August 9, 2014 9:26 PM
Wednesday, February 14, 2007 8:24 PM -
Anyone get Amsdev code working in C#?Friday, February 23, 2007 8:16 PM
-
Amsdev!! ((you are now my best friend !! :) ))
thanks a lot, i was looking for 'IE 7 tabs management' for months.
well, i did translate your C code in VB (level VB5.00), thanks to the help of another sharer on a 'technical PC forum'.
with 'my' version, I have seen that in fact i only walk thru the tabs displayed on screen (what i call level 4 = the children of object number 7),
case when much tabs are opened than the number of tab buttons that can be displayed on the IE7 TabBar on screen.
so, my version will upgrade. to 'walk thru' all tabs in the collection, even those not displayed on screen.
:)
God bless the free sharers !! :)
------------------------- Visual Basic 5.00
Attribute VB_Name = "Module1"
''' référence dans le projet à faire à : Accessibility - oleacc.dll
'''
Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hwnd As Long, ByVal dwId As Long, _
riid As tGUID, ppvObject As Object) As LongDeclare Function AccessibleChildren Lib "oleacc" _
(ByVal paccContainer As IAccessible, ByVal iChildStart As Long, _
ByVal cChildren As Long, rgvarChildren As Variant, _
pcObtained As Long) As Long
Type AccObject
objIA As IAccessible
lngChild As Long
End TypeType tGUID
lData1 As Long
nData2 As Integer
nData3 As Integer
abytData4(0 To 7) As Byte
End TypeType RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypeDim oIA As IAccessible
Dim tg As tGUID
Dim lReturn As Long
Dim IBreak As Long
Dim NbOnglet As Long
Dim ct1 As Long
Dim ct2 As Long
Dim ct3 As Long
Dim ct4 As Long
Dim ct5 As Long
Dim ct6 As Long
Dim ct7 As LongPrivate Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
'Retrieve the IAccessible interface from a window handle
'Reference:Jean Ross,Chapter 17: Accessibility in Visual Basic,Advanced Microsoft Visual Basic 6.0, 2nd Edition
Function IAccessibleFromHwnd(hwnd As Long) As IAccessible
' Define the GUID for the IAccessible object
' {618736E0-3C3D-11CF-810C-00AA00389B71}
With tg
.lData1 = &H618736E0
.nData2 = &H3C3D
.nData3 = &H11CF
.abytData4(0) = &H81
.abytData4(1) = &HC
.abytData4(2) = &H0
.abytData4(3) = &HAA
.abytData4(4) = &H0
.abytData4(5) = &H38
.abytData4(6) = &H9B
.abytData4(7) = &H71
End With
' Retrieve the IAccessible object for the form
lReturn = AccessibleObjectFromWindow(hwnd, 0, tg, oIA)
Set IAccessibleFromHwnd = oIA
End FunctionFunction FindAccessibleChildInWindow(hwndParent As Long, IndOnglet As Long, lngRole As Long) As AccObject
Dim oButton As AccObject
Dim oParent As IAccessible
Set oParent = IAccessibleFromHwnd(hwndParent)
If oParent Is Nothing Then
Set FindAccessibleChildInWindow.objIA = Nothing
Else
FindAccessibleChildInWindow = FindAccessibleChild(oParent, IndOnglet, lngRole)
'oButton = FindAccessibleChild(oParent, strName, lngRole)
'oButton.objIA.accDoDefaultAction oButton.lngChild
'FindAccessibleChildInWindow = oButton
End If
End Function'Recursively looking for a child with specified accName and accRole in the accessibility tree
Function FindAccessibleChild(oParent As IAccessible, IndOnglet As Long, lngRole As Long) As AccObject
Dim oButton As AccObject
Dim lHowMany As Long
Dim avKids() As Variant
Dim lGotHowMany As Long, i As Integer
Dim oChild As IAccessible
FindAccessibleChild.lngChild = CHILDID_SELF
If oParent.accChildCount = 0 Then
Set FindAccessibleChild.objIA = Nothing
Exit Function
End If
lHowMany = oParent.accChildCount
ReDim avKids(lHowMany - 1) As Variant
lGotHowMany = 0
If AccessibleChildren(oParent, 0, lHowMany, avKids(0), lGotHowMany) <> 0 Then
MsgBox "Error retrieving accessible children!"
Set FindAccessibleChild.objIA = Nothing
Exit Function
End If
'To do: the approach described in http://msdn.microsoft.com/msdnmag/issues/0400/aaccess/default.aspx
' are probably better and more reliable
ct1 = lGotHowMany + ct1
IBreak = IBreak + 1
'MsgBox "ct1: " & ct1 & " - IBreak: " & IBreak
lGotHowManyM1 = lGotHowMany - 1
On Error Resume Next
For i = 0 To lGotHowManyM1
If IsObject(avKids(i)) Then
''' pas de controle sur libelle avKids(i).accName
abc = avKids(i).accName
bcd = avKids(i).accRole
cde = avKids(i).Caption
ct2 = ct2 + 1
'MsgBox "ct2: " & ct2 & " - abc: " & abc & " - bcd: " & bcd & " - caption: " & cde _
& " - I: " & i & " - lGotHowMany-1: " & lGotHowManyM1
If IBreak = 4 Then
' onglet à traiter
'avKids(i).accDoDefaultAction avKids(i).lngChild
'MsgBox avKids(i).lngChild ' avKids(i).accDoDefaultAction ' & " - " & avKids(i).lngChild
NbOnglet = NbOnglet + 1
End If
' bool1 = avKids(i).accName Is Empty And avKids(i).accRole Is Empty ' Then
'If IBreak = 4 And StrComp(avKids(i).accName, strName) = 0 And avKids(i).accRole = lngRole Then
If IBreak = 4 Then ' And bool1 Then
ct5 = ct5 + 1
'NbOnglet = NbOnglet + 1
If NbOnglet = IndOnglet Then
Set FindAccessibleChild.objIA = avKids(i)
FindAccessibleChild.objIA.accDoDefaultAction FindAccessibleChild.lngChild
Exit For
End If
If NbOnglet = lGotHowMany Then
MsgBox "Dernier onglet : celui de 'création d'un nouvel onglet'"
Else
'MsgBox "Onglet: " & NbOnglet & " /" & lGotHowMany & " activé. (" & _
lGotHowManyM1 & " onglets + celui de 'création d'un nouvel onglet')"
End If
Else
ct6 = ct6 + 1
Set oChild = avKids(i)
FindAccessibleChild = FindAccessibleChild(oChild, IndOnglet, lngRole)
If Not FindAccessibleChild.objIA Is Nothing Then
ct7 = ct7 + 1
Exit For
End If
End If
Else
ct3 = ct3 + 1
If StrComp(oParent.accName(avKids(i)), strName) = 0 And oParent.accRole(avKids(i)) = lngRole Then
ct4 = ct4 + 1
Set FindAccessibleChild.objIA = oParent
FindAccessibleChild.lngChild = avKids(i)
Exit For
End If
End If
Next i
End FunctionFunction Main(IndOnglet As Long) As Long
On Error Resume Next
'MsgBox "Main : H:\Projet\Outils\VB 5.00\Gestion_Onglets_IE: " & IndOnglet
Const S_OK = 0
Dim oButton As AccObject, w&
w = FindWindowEx(0, 0, "IEFrame", vbNullString)
w = FindWindowEx(w, 0, "CommandBarClass", vbNullString)
w = FindWindowEx(w, 0, "ReBarWindow32", vbNullString)
w = FindWindowEx(w, 0, "TabBandClass", vbNullString)
w = FindWindowEx(w, 0, "DirectUIHWND", vbNullString)
' Retrieve the IAccessible object for the form
Set oIA = IAccessibleFromHwnd(w)
If lReturn <> S_OK Then Main = 999: Exit Function
'MsgBox lReturn & " - oIA.accChildCount: " & oIA.accChildCount
oButton = FindAccessibleChildInWindow(w, IndOnglet, 0) ' "Système", 2) ' "Application", 2)
End Function
-----------------------------------
(people reading, do nothing bad on one other's computer with ''my help'', my spirit could be a sword)
best regard :)- Proposed as answer by nayR_Inverted Saturday, August 9, 2014 9:26 PM
Wednesday, January 7, 2009 9:37 AM -
THIS IS THE END OF IE INTERNET EXPLORER.... NO ONE GOING TO USE IT ANYMORE.
i WILL BE USING .. FIREFOX AND CHROME.... THIS IS THE DOWNFALL OF IE.... TABS SLOW AND NOT WORKING AND MESSING UP MY WORK...YOU SUX
Friday, July 2, 2010 11:00 AM -
Ty For Sharing..
Trying to Automate the File upload Process in IE 11..
DirectUIHWND, Child SysListView32,select 1st - End.
Although this code doesnt show exactly how to do what i want I am going to use it as a basis to work from. Thank you for sharing.
So I will try to Find this thread again and share my code, so maybe DirectUIHWND can be less 'undocumented' and used in a easy way...On Windows 8.1... which as I hear is being scrapped for the upcoming Windows 9..
Search terms used to dig up information about excel VBA oleacc Accessibility I used:Excel lib Oleacc IAcessible DirectUIHWND
I could have added some reductions by adding not python, But -!= +. enjoy the somewhat reduced search results from google, and peace to you fellow fravia.
- Edited by nayR_Inverted Saturday, August 9, 2014 9:40 PM Spelling, refining my wording.
Saturday, August 9, 2014 9:36 PM