⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shlview.cpp

📁 大量windows shell编程例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	   // add "Properties"
	   LoadString(g_hInst, IDS_MI_PROPERTIES, szText, 20 );
	   mii.cbSize = sizeof(MENUITEMINFO);
	   mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
	   mii.fType = MFT_STRING;
	   mii.fState = MFS_ENABLED;
	   mii.dwTypeData = szText;
	   mii.wID = IDM_WIN_PROPERTIES;
	   InsertMenuItem( hSubMenu, 0, TRUE, &mii );

	   // add a separator after them
	   mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
	   mii.fType = MFT_SEPARATOR;
	   mii.fState = MFS_ENABLED;
	   InsertMenuItem( hSubMenu, 2, TRUE, &mii );
	}
}


// MergeHelpMenu
void CShellView::MergeHelpMenu( HMENU hSubMenu )
{
	if( hSubMenu )
	{
		CHAR szText[30];
		DeleteMenu( hSubMenu, 0, MF_BYPOSITION );
	    LoadString( g_hInst, IDS_MI_ABOUT, szText, 30 );
		AppendMenu( hSubMenu, MF_STRING, IDM_HELP_ABOUT, szText );
	}		
}




// NS main window's procedure
LRESULT CALLBACK CShellView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   CShellView* pThis = reinterpret_cast<CShellView*>(GetWindowLong(hWnd, GWL_USERDATA));

   switch(uMsg)
   {
   case WM_NCCREATE:
      {
         LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
         pThis = reinterpret_cast<CShellView*>(lpcs->lpCreateParams);
         SetWindowLong(hWnd, GWL_USERDATA, reinterpret_cast<LONG>(pThis));
         pThis->m_hWnd = hWnd;
      }
      break;

   case WM_CONTEXTMENU:
      return pThis->OnContextMenu();

   case WM_MENUSELECT:
      return pThis->OnMenuSelect(LOWORD(wParam));

   case WM_SIZE:
      return pThis->OnSize(LOWORD(lParam), HIWORD(lParam));

   case WM_CREATE:
      return pThis->OnCreate();

   case WM_SETFOCUS:
      return pThis->OnSetFocus();

   case WM_KILLFOCUS:
      return pThis->OnKillFocus();

   case WM_ACTIVATE:
      return pThis->OnActivate(SVUIA_ACTIVATE_FOCUS);

   case WM_COMMAND:
      return pThis->OnCommand(GET_WM_COMMAND_ID(wParam, lParam),
                              GET_WM_COMMAND_CMD(wParam, lParam),
                              GET_WM_COMMAND_HWND(wParam, lParam));

   case WM_NOTIFY:
      return pThis->OnNotify(wParam, reinterpret_cast<LPNMHDR>(lParam));
   }
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


// OnSetFocus
LRESULT CShellView::OnSetFocus()
{
   // Tell the browser we have the focus
   m_pShellBrowser->OnViewWindowActive(this);

   OnActivate(SVUIA_ACTIVATE_FOCUS);
   return 0;
}

// OnKillFocus
LRESULT CShellView::OnKillFocus()
{
   OnActivate(SVUIA_ACTIVATE_NOFOCUS);
   return 0;
}

// OnCommand
LRESULT CShellView::OnCommand( DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd )
{
	switch( dwCmdID )
	{
		case IDM_WIN_PROCESS:
			ProcessDlg( m_hWnd );
			break;
   
		case IDM_WIN_PROPERTIES:
			ShowProperties( NULL );
			break;

		case IDM_HELP_ABOUT:
		{
			HICON hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE(IDI_WINVIEW) );
			CHAR s1[50], s2[50];
		    LoadString( g_hInst, IDS_ABOUTTEXT, s1, 50 );
		    LoadString( g_hInst, IDS_COMMENT, s2, 50 );
			ShellAbout( m_hWnd, s1, s2, hIcon );
			DestroyIcon( hIcon );
		}
		break;
	}

	return 0;
}


// OnNotify
LRESULT CShellView::OnNotify(UINT CtlID, LPNMHDR lpnmh)
{
   switch(lpnmh->code)
   {
   case NM_SETFOCUS:
      OnSetFocus();
      break;

   case NM_KILLFOCUS:
      OnDeactivate();
      break;

   case HDN_ENDTRACK:
      g_nColumn1 = ListView_GetColumnWidth(m_hwndList, 0);
      g_nColumn2 = ListView_GetColumnWidth(m_hwndList, 1);
      g_nColumn3 = ListView_GetColumnWidth(m_hwndList, 2);
      g_nColumn4 = ListView_GetColumnWidth(m_hwndList, 3);
      return 0;

   case HDN_ITEMCLICK:
      {
         NMHEADER* pNMH = reinterpret_cast<NMHEADER*>(lpnmh);

         // Have we to reverse the order?
         if(m_pSFParent->m_uSortField == 1 + pNMH->iItem)
            m_pSFParent->m_uSortField = (-1) * (1 + pNMH->iItem);
         else
            m_pSFParent->m_uSortField = 1 + pNMH->iItem;

         ListView_SortItems(m_hwndList, CompareItems, reinterpret_cast<LPARAM>(m_pSFParent));
      }
      return 0;

   case LVN_ITEMACTIVATE:
      {
         LV_ITEM lvItem;
         ZeroMemory(&lvItem, sizeof(LV_ITEM));
         lvItem.mask = LVIF_PARAM;

         LPNMLISTVIEW lpnmlv = reinterpret_cast<LPNMLISTVIEW>(lpnmh);
         lvItem.iItem = lpnmlv->iItem;
         ListView_GetItem(m_hwndList, &lvItem);
         m_pShellBrowser->BrowseObject(reinterpret_cast<LPITEMIDLIST>(lvItem.lParam),
                              SBSP_DEFBROWSER | SBSP_RELATIVE);
         return 0;
      }
   }
    return 0;
}



// OnSize
LRESULT CShellView::OnSize( WORD wWidth, WORD wHeight )
{
	if( m_hwndList )
	   MoveWindow( m_hwndList, 0, 0, wWidth, wHeight, TRUE );
	return 0;
}


// OnCreate	
LRESULT CShellView::OnCreate( VOID )
{
	if( CreateList() )
	if( InitList() )
		FillList();

    return 0;
}


// OnContextMenu
LRESULT CShellView::OnContextMenu( VOID )
{
	HMENU h = LoadMenu( g_hInst, MAKEINTRESOURCE(IDR_CTXTMENU) );
	HMENU hmnu = GetSubMenu( h, 0 );

	POINT pt;
	::GetCursorPos( &pt );
	UINT uCmd = TrackPopupMenu( hmnu, TPM_LEFTALIGN|TPM_NONOTIFY|TPM_RETURNCMD,
		pt.x, pt.y, 0, m_hwndList/* any wnd, but a wnd! */, NULL );
	DestroyMenu( h );
	

	switch( uCmd )
	{
		case IDM_CTXT_COPY:
			CopyTextToClipboard( NULL );
			break;

		case IDM_WIN_PROPERTIES:
			ShowProperties( NULL );
			break;
	}

	return 1; 
}


// CopyTextToClipboard
VOID CShellView::CopyTextToClipboard( LPITEMIDLIST pidlSource )
{
	// Get a valid PIDL. If NULL is passed try to get the 
	// currently selected item in the listview.
	LPITEMIDLIST pidl;
	if( pidlSource==NULL )
	{
		LV_ITEM lvi;
		if( !GetSelectedItem( &lvi ) ) 
		{
			CHAR s[200];
			LoadString( g_hInst, IDS_SELECTFIRST, s, 200 );
			MessageBox( 0, s, 0, MB_ICONEXCLAMATION );
			return;
		}
		pidl = m_pPidlMgr->Copy( (LPITEMIDLIST) lvi.lParam );
	}
	else
		pidl = m_pPidlMgr->Copy(pidlSource);



	// copy to clipboard
	CHAR szText[MAX_PATH];
	m_pPidlMgr->GetPidlPath( pidl, szText );
	ClipboardCopy( szText );
	return;
}


// ShowProperties
VOID CShellView::ShowProperties( LPITEMIDLIST pidlSource )
{
	// Get a valid PIDL. If NULL is passed try to get the 
	// currently selected item in the listview.
	LPITEMIDLIST pidl;

	if( pidlSource==NULL )
	{
		LV_ITEM lvi;
		if( !GetSelectedItem( &lvi ) ) 
		{
			CHAR s[200];
			LoadString( g_hInst, IDS_SELECTFIRST, s, 200 );
			MessageBox( 0, s, 0, MB_ICONEXCLAMATION );
			return;
		}
		pidl = m_pPidlMgr->Copy( (LPITEMIDLIST) lvi.lParam );
	}
	else
		pidl = m_pPidlMgr->Copy(pidlSource);

	// get the HWND
	HWND hwnd = m_pPidlMgr->GetData( pidl );

	// get info about the window 
	WNDINFO wi;
	GetWindowProperties( hwnd, &wi );
	DialogBoxParam( g_hInst, MAKEINTRESOURCE(IDD_PROP),
		GetFocus(), (DLGPROC) PropDlgProc, (LPARAM) &wi );
}


// GetSelectedItem
LRESULT CShellView::GetSelectedItem( LPLVITEM plvi )
{
	INT i = ListView_GetNextItem( m_hwndList, -1, LVNI_SELECTED );
	if( i == -1 ) 
		return 0;

	if( plvi==NULL )
		return 0;
	
	ZeroMemory( plvi, sizeof(LV_ITEM) );
	plvi->mask = LVIF_PARAM;
	plvi->iItem = i;
	ListView_GetItem( m_hwndList, plvi );
	return 1;
}



// Properties dialog procedure
LRESULT CALLBACK CShellView::PropDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

	switch( uMsg )
	{
		case WM_INITDIALOG:
		{
			// add a tab
			TC_ITEM tcPage;      
			HWND hctlTab = GetDlgItem( hDlg, IDC_TABCTRL );
		    tcPage.mask = TCIF_TEXT;
			CHAR szBuf[100];
			LoadString( g_hInst, IDS_GENERAL, szBuf, 100 );
			tcPage.pszText = szBuf;
			tcPage.cchTextMax = sizeof(szBuf);
			TabCtrl_InsertItem( hctlTab, 0, (TC_ITEM FAR*)&tcPage );
			
			// initialize
			LPWNDINFO lpwi = (LPWNDINFO) lParam;
			SetDlgItemText( hDlg, IDC_EDIT, lpwi->pszInfo );
			HWND hwndIcon = GetDlgItem(hDlg, IDC_WNDICON);
			SendMessage( hwndIcon, STM_SETIMAGE, IMAGE_ICON, 
				(LPARAM) lpwi->hIcon );
			SetWindowText( hDlg, lpwi->szCaption );
			SetFocus( hwndIcon );
		}
		break;

		case WM_COMMAND:
			switch( LOWORD(wParam) )
			{
				case IDCANCEL:
					EndDialog( hDlg, 0 );
					break;
			}
	}

	return 0;
}





// CreateList
BOOL CShellView::CreateList()
{
   DWORD dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
                           LVS_SINGLESEL | LVS_REPORT | LVS_SHAREIMAGELISTS;

   // Create the list view
   m_hwndList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL, dwStyle,
                               0, 0, 0, 0, m_hWnd,
                               reinterpret_cast<HMENU>(ID_LISTVIEW),
                               g_hInst, NULL);

   if(!m_hwndList)
      return FALSE;

   // Set some extended styles
   DWORD dwExStyle = LVS_EX_TRACKSELECT | LVS_EX_UNDERLINEHOT |
                               LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP;

   ListView_SetExtendedListViewStyle(m_hwndList, dwExStyle);
   return TRUE;
}



// InitList
BOOL CShellView::InitList()
{
   TCHAR szString[MAX_PATH] = {0};

   // Empty the list view
   ListView_DeleteAllItems(m_hwndList);

   // Initialize the columns
   LV_COLUMN lvColumn;
   lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
   lvColumn.fmt = LVCFMT_LEFT;
   lvColumn.pszText = szString;

   lvColumn.cx = g_nColumn1;
   LoadString(g_hInst, IDS_COLUMN1, szString, MAX_PATH);
   ListView_InsertColumn(m_hwndList, 0, &lvColumn);
   RECT rc;
   GetClientRect(m_hWnd, &rc);

   lvColumn.cx = g_nColumn2;
   LoadString(g_hInst, IDS_COLUMN2, szString, MAX_PATH);
   ListView_InsertColumn(m_hwndList, 1, &lvColumn);

   lvColumn.cx = g_nColumn3;
   LoadString(g_hInst, IDS_COLUMN3, szString, MAX_PATH);
   ListView_InsertColumn(m_hwndList, 2, &lvColumn);

   lvColumn.cx = g_nColumn4;
   LoadString(g_hInst, IDS_COLUMN4, szString, MAX_PATH);
   ListView_InsertColumn(m_hwndList, 3, &lvColumn);

   ListView_SetImageList(m_hwndList, g_himlSmall, LVSIL_SMALL);
   return TRUE;
}


// FillList
void CShellView::FillList()
{
   LPENUMIDLIST pEnumIDList = NULL;

   // Get the enumerator object for the folder. EnumObjects() is called
   // through the pointer received via the CShellView constructor.
   HRESULT hr = m_pSFParent->EnumObjects(
                m_hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);

   if(SUCCEEDED(hr))
   {
      LPITEMIDLIST pidl = NULL;

      // Stop redrawing to avoid flickering
      SendMessage(m_hwndList, WM_SETREDRAW, FALSE, 0);

      // Add items
      DWORD dwFetched;
      while((pEnumIDList->Next(1, &pidl, &dwFetched) == S_OK) && dwFetched)
      {
         LV_ITEM lvi;
         ZeroMemory(&lvi, sizeof(LV_ITEM));
         lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
         lvi.iItem = ListView_GetItemCount(m_hwndList);

         // Store PIDL to the HWND, using the lParam member for each item
         HWND h = m_pPidlMgr->GetData(pidl);
         lvi.lParam = reinterpret_cast<LPARAM>(m_pPidlMgr->Create(h));

         // Column 1: state (set image too)
         TCHAR szState[30] = {0};
         if(m_pPidlMgr->HasChildren(h))
         {
            lvi.iImage = 0;
            LoadString(g_hInst, IDS_CHILDREN, szState, 30);
         }
         else
         {
            lvi.iImage = 1;
            LoadString(g_hInst, IDS_NOCHILDREN, szState, 30);
         }
         lvi.pszText = szState;

         // Add the item
         int i = ListView_InsertItem(m_hwndList, &lvi);

         // Fill the subitem 2: HWND
         TCHAR szBuf[MAX_PATH] = {0};
         wsprintf(szBuf, __TEXT("0x%04X"), h);
         ListView_SetItemText(m_hwndList, i, 2, szBuf);

         // Fill the subitem 3: Title
         GetWindowText(h, szBuf, MAX_PATH);
         ListView_SetItemText(m_hwndList, i, 3, szBuf);

         // Fill the subitem 1: Class
         GetClassName(h, szBuf, MAX_PATH);
         ListView_SetItemText(m_hwndList, i, 1, szBuf);
      }

      // Sort the items by HWND initially
      ListView_SortItems(
           m_hwndList, CompareItems, reinterpret_cast<LPARAM>(m_pSFParent));

      // Redraw the list view
      SendMessage(m_hwndList, WM_SETREDRAW, TRUE, 0);
      InvalidateRect(m_hwndList, NULL, TRUE);
      UpdateWindow(m_hwndList);
      pEnumIDList->Release();
   }
}


// OnMenuSelect
LRESULT CShellView::OnMenuSelect( WORD wID )
{
	if( wID==IDM_WIN_PROCESS )
		m_pShellBrowser->SetStatusTextSB( L"Shows the active processes." );

	if( wID==IDM_WIN_PROPERTIES )
		m_pShellBrowser->SetStatusTextSB( L"Shows window properties." );
	
	if( wID==IDM_HELP_ABOUT )
		m_pShellBrowser->SetStatusTextSB( L"Shows information about the 'Windows View' namespace extension." );

	if( wID==4 )
		m_pShellBrowser->SetStatusTextSB( L"Displays command for the 'Windows View' namespace extension." );

	return 1;
}

/*  End of file:  ShlView.cpp  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -