📄 shlview.cpp
字号:
// 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 + -