Click here to Skip to main content
15,887,267 members
Articles / Desktop Programming / MFC
Article

Taskbar Sorter Utility

Rate me:
Please Sign up or sign in to vote.
4.82/5 (20 votes)
11 Jun 2002CPOL1 min read 174.2K   3.7K   50   35
Utility to change order of icons in taskbar

Introduction

This utility allows you to change the order of items on your taskbar, by dragging them into position in a list.

Taskbar Sorter

The list shows all of your visible top-level windows. To move a window you simply drag the window's title into the order you wish the windows to appear, and click the Sort button.

To exit the utility, click on the Close button.

How it works

The application enumerates windows which are top-level (ie have no owner), and do not explicitly prevent themselves appearing in the taskbar. It adds each of the windows' titles to a drag list box (CDragListBox), along with the icon for the app. The user can then re-order the windows. When the user clicks the Sort button, each window is hidden using ShowWindow(SW_HIDE) and then re-shown (ShowWindow(SW_SHOW)) in the order of the list - top to bottom. This has the effect of the window being removed from the taskbar and then being re-added at the right-hand side.

Known limitations

Unfortunately there doesn't appear to be any way of interrogating the taskbar to determine, firstly which windows appear there, and secondly in what order they currently appear. This means that each time the utility is run the user needs to re-order each window from scratch.

That's all there is to it - have fun!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United Kingdom United Kingdom
Originally from an electronics background, I moved into software in 1996, partly as a result of being made redundant, and partly because I was very much enjoying the small amount of coding (in-at-the-deep-end-C) that I had been doing!

I swiftly moved from C to C++, and learned MFC, and then went on to real-time C on Unix. After this I moved to the company for which I currently work, which specialises in Configuration Management software, and currently program mainly in C/C++, for Windows. I have been gradually moving their legacy C code over to use C++ (with STL, MFC, ATL, and WTL). I have pulled in other technologies (Java, C#, VB, COM, SOAP) where appropriate, especially when integrating with third-party products.

In addition to that, I have overseen the technical side of the company website (ASP, VBScript, JavaScript, HTML, CSS), and have also worked closely with colleagues working on other products (Web-based, C#, ASP.NET, SQL, etc).

For developing, I mainly use Visual Studio 2010, along with an in-house-designed editor based on Andrei Stcherbatchenko's syntax parsing classes, and various (mostly freeware) tools. For website design, I use Dreaweaver CS3.

When not developing software, I enjoy listening to and playing music, playing electric and acoustic guitars and mandolin.

Comments and Discussions

 
QuestionRe: New category? Pin
mla15424-Jan-13 4:39
mla15424-Jan-13 4:39 
GeneralMy vote of 3 Pin
SercanOzdemir7-Dec-11 8:02
SercanOzdemir7-Dec-11 8:02 
GeneralMy vote of 5 Pin
Pepsibot9-Sep-10 5:40
Pepsibot9-Sep-10 5:40 
GeneralDont work with "Group similar taskbar buttons" enabled. [modified] Pin
Alejandro Pardo30-Dec-08 9:05
Alejandro Pardo30-Dec-08 9:05 
AnswerRe: Dont work with "Group similar taskbar buttons" enabled. Pin
Paul Vickery6-Jan-09 0:56
professionalPaul Vickery6-Jan-09 0:56 
GeneralRe: Dont work with "Group similar taskbar buttons" enabled. Pin
Alejandro Pardo6-Jan-09 1:34
Alejandro Pardo6-Jan-09 1:34 
Question.Net Code Pin
plury19-Feb-07 5:16
plury19-Feb-07 5:16 
GeneralDrag and Drop buttons on Taskbar and save order Pin
The Code Machine27-Jan-06 21:14
The Code Machine27-Jan-06 21:14 
GeneralRe: Drag and Drop buttons on Taskbar and save order Pin
Sa6ry3-Apr-06 7:06
Sa6ry3-Apr-06 7:06 
GeneralSave the Order Pin
HerrDamit8-Aug-04 3:35
HerrDamit8-Aug-04 3:35 
GeneralRe: Save the Order Pin
kpatelPro29-Oct-04 8:19
kpatelPro29-Oct-04 8:19 
GeneralRe: Save the Order Pin
DTY15-Aug-05 8:45
DTY15-Aug-05 8:45 
Hi, all:

First it is a good and very useful tool that will rescue to my "memory leak" especially when I have so many windows opened.

I have found the same need to save the order especially when I open new windows and would like to add them to the sorting list. If I close the sorter and reopen it, the new windows are added to the list but the order is changed based on the current z-ordering.

I have made a bit enhancement to the program to keep the original list (not to save it to a file anyway)intact but keep refreshing itself with newly added windows (appending them to the end of the list) when the "sort" button is clicked.

The code is working but I did not polish it. So it could cause some leak, etc.

The code is as follows.

In TaskbarSortDlg.cpp, function void CTaskbarSortDlg::OnOK()

=======================
void CTaskbarSortDlg::OnOK()
{

TRACE0("==== Fill list again\n");

int n;



// get each of the windows in the list, and hide, then re-show them
// that should leave them in the correct order in the taskbar

// GetCount(): CListBox function

int nNumItems = m_listWindows.GetCount();

TRACE1("==== nNumItems = %d\n", nNumItems);

HWND *ha;
char **la;

ha = new HWND[nNumItems];
la = new char*[nNumItems];

char *lpsz;


// copy list
for (n = 0; n < nNumItems; n++)
{

// save HWND
ha[n] = (HWND)m_listWindows.GetItemData(n);

// save titles
lpsz = new char[(m_listWindows.GetTextLen(n))];
m_listWindows.GetText(n, lpsz);

la[n] = lpsz;

TRACE1("==== lpsz = %s\n", lpsz);

}

// clean up
for (n = 0; n < nNumItems; n++)
{
TRACE1("====== delete %d\n", n);
int ret = m_listWindows.DeleteString(0);
// the index will change after the delete; so always delete the first one
//int ret = m_listWindows.DeleteString(n);
TRACE1("====== ret = %d\n", ret);
}

int nNumItems2 = m_listWindows.GetCount();


TRACE1("==== after clean up = %d\n", nNumItems2);

// refresh

FillList();

nNumItems2 = m_listWindows.GetCount();

TRACE1("==== after clean up = %d\n", nNumItems2);

// resort

int copy = 0;

for (n = 0; n < nNumItems; n++)
{
int m = m_listWindows.FindStringExact(-1, la[n]);

TRACE1("==== n = %d\n", n);
TRACE1("==== m = %d\n", m);
TRACE1("==== la[n] = %s\n", la[n]);
TRACE1("==== ha[n] = %d\n", ha[n]);

// if find same one, delete it and add to the end
// if not found then ignore it
// this way the final list would be new items + existing old items

if(m != LB_ERR && (HWND)m_listWindows.GetItemData(m) == ha[n])
{
int ret = m_listWindows.DeleteString(m);
// delete from list
TRACE1("==== ret = %d\n", ret);

int temp = m_listWindows.GetCount();
TRACE1("==== temp = %d\n", temp);


// add to end of list
m_listWindows.AddString(la[n]);

temp = m_listWindows.GetCount();

TRACE1("==== temp = %d\n", temp);
// should -1 because deleted first
m_listWindows.SetItemData(temp-1,(DWORD)ha[n]);

lpsz = new char[(m_listWindows.GetTextLen(temp-1))];
m_listWindows.GetText(temp-1, lpsz);

TRACE1("==== copied lpsz = %s\n", lpsz);
TRACE1("==== copied hwnd = %d\n", m_listWindows.GetItemData(temp-1));

//delete lpsz;

copy++;
}
else
{
TRACE0("=== New");
}

}

// move the new items to the end

int nNumItems1 = m_listWindows.GetCount();

TRACE1("==== nNumItems1 = %d\n", nNumItems1);

int diff = nNumItems1 - copy;

TRACE1("==== diff = %d\n", diff);

for (n = 0; n < diff; n++)
{

lpsz = new char[(m_listWindows.GetTextLen(0))];
m_listWindows.GetText(0, lpsz);

TRACE1("==== new lpsz = %s\n", lpsz);

m_listWindows.AddString(lpsz);

DWORD nhwnd = m_listWindows.GetItemData(0);

TRACE1("==== new hwnd = %d\n", nhwnd);

int temp = m_listWindows.GetCount();

TRACE1("==== temp = %d\n", temp);

// need to remember to -1 from count
m_listWindows.SetItemData(temp -1,(DWORD) nhwnd);

m_listWindows.DeleteString(0);

}


nNumItems = m_listWindows.GetCount();

TRACE1("==== nNumItems = %d\n", nNumItems);

for (n = 0; n < nNumItems; n++)
{
HWND hwnd = (HWND)m_listWindows.GetItemData(n);
TRACE1("==== hwnd = %d\n", hwnd);
::ShowWindow(hwnd, SW_HIDE);
::ShowWindow(hwnd, SW_SHOW);
}
// now hide and show self
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOW);
SetForegroundWindow();


// don't close the dialog
//CDialog::OnOK();
}

==============================================
Thanks to Paul's good work and hope this helps, too.

David
GeneralRe: Save the Order Pin
DTY22-Jun-06 6:08
DTY22-Jun-06 6:08 
GeneralWindows XP Pin
wayside28-Jul-04 6:43
wayside28-Jul-04 6:43 
GeneralIcon Color Improvement Pin
Atlantys16-Jun-02 19:27
Atlantys16-Jun-02 19:27 
GeneralJames would be tickled by this Pin
Nish Nishant12-Jun-02 19:05
sitebuilderNish Nishant12-Jun-02 19:05 
GeneralRe: James would be tickled by this Pin
Paul Vickery12-Jun-02 22:31
professionalPaul Vickery12-Jun-02 22:31 
GeneralRe: James would be tickled by this Pin
Nish Nishant12-Jun-02 23:46
sitebuilderNish Nishant12-Jun-02 23:46 
GeneralPC Mag has similar utility Pin
12-Jun-02 14:31
suss12-Jun-02 14:31 
GeneralRe: PC Mag has similar utility Pin
Paul Vickery12-Jun-02 22:34
professionalPaul Vickery12-Jun-02 22:34 
GeneralRe: PC Mag has similar utility Pin
vikrant kpr13-Jul-07 3:56
vikrant kpr13-Jul-07 3:56 
GeneralRe: PC Mag has similar utility Pin
Philippe Lhoste24-Jun-02 0:42
Philippe Lhoste24-Jun-02 0:42 
GeneralRe: PC Mag has similar utility Pin
Synetech12-Aug-06 16:34
Synetech12-Aug-06 16:34 
GeneralCool Pin
Rama Krishna Vavilala12-Jun-02 3:24
Rama Krishna Vavilala12-Jun-02 3:24 
GeneralRe: Cool Pin
Atlantys12-Jun-02 20:21
Atlantys12-Jun-02 20:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.