May 30th, 2016

Printing the name and position of the focused item on the desktop

Today’s Little Program prints the name and position of the focused item on the desktop. Remember, Little Programs do little to no error checking.

#define UNICODE
#define _UNICODE
#include "stdafx.h"
#include <windows.h>
#include <shlobj.h>
#include <exdisp.h>
#include <shlwapi.h>
#include <atlbase.h>
#include <atlalloc.h>
#include <stdio.h>

int __cdecl wmain(int argc, wchar_t **argv)
{
  CCoInitialize init;
  CComPtr<IFolderView> spView;
  FindDesktopFolderView(IID_PPV_ARGS(&spView));
  CComPtr<IShellFolder> spFolder;
  spView->GetFolder(IID_PPV_ARGS(&spFolder));

  int iItem;
  if (FAILED(spView->GetFocusedItem(&iItem))) {
    wprintf(L"Sorry, no focused item.\n");
    return 0;
  }

  CComHeapPtr<ITEMID_CHILD> spidl;
  spView->Item(iItem, &spidl);

  STRRET str;
  spFolder->GetDisplayNameOf(spidl, SHGDN_NORMAL, &str);
  CComHeapPtr<wchar_t> spszName;
  StrRetToStr(&str, spidl, &spszName);

  wprintf(L"Focused item is %ls\n", static_cast<LPWSTR>(spszName));
  spszName.Free();

  spFolder->GetDisplayNameOf(spidl, SHGDN_FORPARSING, &str);
  StrRetToStr(&str, spidl, &spszName);
  wprintf(L"Parsing name is %ls\n", static_cast<LPWSTR>(spszName));

  POINT pt;
  spView->GetItemPosition(spidl, &pt);
  wprintf(L"Position is %d, %d\n", pt.x, pt.y);

  return 0;
}

We actually have most of the necessary pieces lying around already.

After initializing COM and getting the desktop folder view, we get the underlying IShell­Folder because we’re going to need it in order to interpret the pidls that come out later.

We ask the view for the index of the focused item. If it can’t cough one up, then we apologize and exit.

Otherwise, we use that index to get the corresponding pidl and then ask the folder to convert it into a normal name (which is the name shown under the icon) and a parsing name (which for files is the full path name).

Finally, we ask for the item position.

There you have it, a little program that identifies the current focused item on the desktop.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.