📄 accessenum.cpp
字号:
SendMessage( hTree, LVM_GETITEMTEXT, Item, (LPARAM) &lvi );
_bstr_t Text( tmp );
return Text;
}
//----------------------------------------------------------------------
//
// MainDialog
//
// Main interface for editing output
//
//----------------------------------------------------------------------
LRESULT CALLBACK MainDialog( HWND hDlg, UINT message, UINT wParam, LONG lParam )
{
static CResizer resizer;
int idx;
OPENFILENAME open;
static TCHAR exportPath[ MAX_PATH ];
TCHAR * p;
bool ok;
DWORD style;
static bool Starting = true;
static HCURSOR hCursor;
switch ( message ) {
case WM_INITDIALOG:
// set anchor points
resizer.OnInitDialog( hDlg );
resizer.SetHorz( GetDlgItem(hDlg,IDC_REFRESH), ANCHOR_LEFT );
resizer.SetHorz( GetDlgItem(hDlg,IDC_EXPORT), ANCHOR_LEFT );
resizer.SetVert( GetDlgItem(hDlg,IDC_LIST), ANCHOR_BOTH );
resizer.SetHorz( GetDlgItem(hDlg,IDC_PATH), ANCHOR_BOTH );
resizer.SetHorz( GetDlgItem(hDlg,IDC_DESCRIPTION), ANCHOR_LEFT );
resizer.SetHorz( GetDlgItem(hDlg,IDC_STATUS), ANCHOR_BOTH );
// clear status text
SetWindowText( GetDlgItem(hDlg,IDC_STATUS), _T("") );
// Set cursor for window
hCursor = LoadCursor( NULL, IDC_ARROW );
SetClassLong( hDlg, GCL_HCURSOR, (LONG)hCursor );
SetCursor( hCursor );
// Create listview columns
InitListViewColumns( GetDlgItem(hDlg,IDC_LIST), Columns, sizeof Columns/sizeof Columns[0] - 1 );
style = GetWindowLong( GetDlgItem(hDlg,IDC_LIST), GWL_STYLE );
style |= LVS_SHOWSELALWAYS;
SetWindowLong( GetDlgItem(hDlg,IDC_LIST), GWL_STYLE, style );
ListView_SetExtendedListViewStyleEx( GetDlgItem(hDlg,IDC_LIST), LVS_EX_LABELTIP, LVS_EX_LABELTIP );
#if 0
if ( ! IsDomainAdmin() ) {
MessageBox( hDlg, _T("Information may be incomplete because you are not a domain administrator"), APPNAME, MB_OK|MB_ICONWARNING );
}
#endif
{
TCHAR Path[ MAX_PATH ] = _T("");
GetEnvironmentVariable( _T("SYSTEMROOT"), Path, MAX_PATH );
SetDlgItemText( hDlg, IDC_PATH, Path );
}
return TRUE;
case WM_SETCURSOR:
switch ( LOWORD(lParam) ) {
case HTTOP:
case HTBOTTOM:
case HTLEFT:
case HTRIGHT:
case HTTOPLEFT:
case HTTOPRIGHT:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
break;
default:
SetCursor( hCursor );
return true;
}
break;
case WM_APP_ENUM_COMPLETE:
EnableWindow( GetDlgItem( hDlg, IDC_REFRESH ), true );
EnableWindow( GetDlgItem( hDlg, IDC_PATH ), true );
EnableWindow( GetDlgItem( hDlg, IDC_BROWSE_FILE ), true );
EnableWindow( GetDlgItem( hDlg, IDC_BROWSE_REG ), true );
EnableWindow( GetDlgItem( hDlg, IDCANCEL ), false );
EnableWindow( GetDlgItem( hDlg, IDC_EXPORT ), true );
hCursor = LoadCursor( NULL, IDC_ARROW );
SetClassLong( hDlg, GCL_HCURSOR, (LONG)hCursor );
SetCursor( hCursor );
if ( g.Abort ) {
SendMessage( g.Abort, WM_CLOSE, 0, 0 );
// MessageBox( hDlg, _T("Scan cancelled by user"), APPNAME, MB_OK|MB_ICONINFORMATION );
}
break;
case WM_NOTIFY:
if ( LOWORD(wParam) == IDC_LIST ) {
NMLISTVIEW * nm = (NMLISTVIEW *) lParam;
switch( nm->hdr.code ) {
case LVN_COLUMNCLICK:
// sort column
SortListView( nm->hdr.hwndFrom, nm->iSubItem, Columns );
break;
case NM_DBLCLK:
// double click item, so display device properties
idx = ListView_GetSelectionMark( GetDlgItem(hDlg,IDC_LIST) );
if ( idx >= 0 ) {
TCHAR path[ MAX_UNCPATH ];
ListView_GetItemText( GetDlgItem(hDlg,IDC_LIST), idx, 0, path, MAX_UNCPATH );
ShellExecute( NULL, _T("explore"), path, NULL, NULL, SW_SHOWNORMAL );
}
break;
case NM_RCLICK:
// Create pop-up menu
idx = ListView_GetSelectionMark( GetDlgItem(hDlg,IDC_LIST) );
if ( idx >= 0 ) {
TCHAR path[ MAX_UNCPATH ];
ListView_GetItemText( GetDlgItem(hDlg,IDC_LIST), idx, 0, path, MAX_UNCPATH );
idx = _tcsnicmp( path, _T("HK"), 2 ) ? MF_ENABLED : MF_GRAYED;
} else {
idx = MF_ENABLED;
}
{
HMENU hMenu = LoadMenu( g.hInst, _T("POPUP") );
HMENU hSubMenu = GetSubMenu( hMenu, 0 );
POINT pt;
GetCursorPos( &pt );
EnableMenuItem( hSubMenu, IDC_PROPERTIES, MF_BYCOMMAND|idx );
TrackPopupMenu( hSubMenu,
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
pt.x, pt.y, 0, hDlg, NULL);
DestroyMenu( hMenu );
}
break;
}
}
break;
case WM_COMMAND:
// Normal notifications
switch ( LOWORD(wParam) ) {
case IDC_QUIT:
// quit
SendMessage( hDlg, WM_CLOSE, 0, 0 );
break;
case IDCANCEL:
// is an enumeration in progress?
if ( ! IsWindowEnabled( GetDlgItem( hDlg, IDC_REFRESH ) ) ) {
// have we already cancelled it?
if ( g.Abort == NULL ) {
g.Abort = CreateDialog( g.hInst, _T("ABORT"), hDlg, AbortDialog );
}
}
break;
case IDC_ABOUT:
DialogBox( g.hInst, _T("ABOUT"), hDlg, AboutDialog );
break;
case IDC_FILEOPTIONS:
DialogBox( g.hInst, _T("FILEPERM"), hDlg, FilePermDialog );
break;
case IDC_HELPCONTENTS:
DialogBox( g.hInst, _T("HELP"), hDlg, HelpDialog );
break;
case IDOK:
// convert to IDC_REFRESH
return SendMessage( hDlg, WM_COMMAND, MAKEWPARAM(IDC_REFRESH,HIWORD(wParam)), lParam );
case IDC_BROWSE_FILE:
{
BROWSEINFO bi = { 0 };
bi.hwndOwner = hDlg;
bi.ulFlags = BIF_NONEWFOLDERBUTTON | BIF_RETURNONLYFSDIRS ;
bi.lpszTitle = _T("Select the folder to enumerate:");
ITEMIDLIST * pidl = SHBrowseForFolder( &bi );
TCHAR Path[ MAX_UNCPATH ];
if ( pidl && SHGetPathFromIDList( pidl, Path ) ) {
SetDlgItemText( hDlg, IDC_PATH, Path );
LPMALLOC pMalloc = NULL;
SHGetMalloc( &pMalloc );
pMalloc->Free( pidl );
}
}
break;
case IDC_BROWSE_REG:
{
_bstr_t Path;
if ( DialogBoxParam( g.hInst, _T("REGBROWSE"), hDlg, BrowseRegDialog, (LPARAM)&Path ) )
SetDlgItemText( hDlg, IDC_PATH, Path );
}
break;
case IDC_REFRESH:
if ( IsWindowEnabled( GetDlgItem( hDlg, IDC_REFRESH ) ) ) {
// Create a list of all file permissions
EnableWindow( GetDlgItem( hDlg, IDC_REFRESH ), false );
EnableWindow( GetDlgItem( hDlg, IDC_PATH ), false );
EnableWindow( GetDlgItem( hDlg, IDC_BROWSE_FILE ), false );
EnableWindow( GetDlgItem( hDlg, IDC_BROWSE_REG ), false );
EnableWindow( GetDlgItem( hDlg, IDCANCEL ), true );
EnableWindow( GetDlgItem( hDlg, IDC_EXPORT ), false );
hCursor = LoadCursor( NULL, IDC_APPSTARTING );
SetClassLong( hDlg, GCL_HCURSOR, (LONG)hCursor );
SetCursor( hCursor );
delete g.ShareList;
g.ShareList = NULL;
g.Abort = NULL;
ListView_DeleteAllItems( GetDlgItem(hDlg,IDC_LIST) );
g.Exclude = (TCHAR *)NULL;
// get path to enumerate
TCHAR Path[ MAX_PATH ];
GetDlgItemText( hDlg, IDC_PATH, Path, MAX_PATH );
// if it is on a network then get name of system it is on
TCHAR NetworkPath[ MAX_PATH ] = _T("\0\0\0");
if ( Path[0] == '\\' && Path[1] == '\\' ) {
_tcscpy( NetworkPath, Path );
} else if ( Path[1] == ':' ) {
// convert drive to unc path, if share
TCHAR DevicePath[ 3 ] = { Path[0], ':', 0 };
DWORD nb = MAX_PATH;
WNetGetConnection( DevicePath, NetworkPath, &nb );
}
if ( NetworkPath[0] ) {
// get file server name
TCHAR * ptr = _tcschr( NetworkPath+2, '\\' );
if ( ptr )
*ptr = 0;
else
NetworkPath[0] = 0;
}
CEnumeration * root = NULL;
if ( _tcsnicmp( Path, _T("HK"), 2 ) == 0 ) {
// traverse registry
root = new CRegEnumeration( Path, true );
} else {
// traverse directory
root = new CFileEnumeration( Path, true );
}
if ( root == NULL ) {
MessageBox( hDlg, _T("Path not found"), APPNAME, MB_OK|MB_ICONWARNING );
break;
}
CTraversal * e = new CTraversal( GetDlgItem(hDlg,IDC_LIST),
NetworkPath[0] ? NetworkPath+2 : _T(""),
root );
e->Start();
// delete root;
// Add path to list of paths in combo box
idx = SendMessage( GetDlgItem(hDlg,IDC_PATH), CB_FINDSTRINGEXACT, -1, (LPARAM) Path );
if ( idx != CB_ERR )
SendMessage( GetDlgItem(hDlg,IDC_PATH), CB_DELETESTRING, idx, 0 );
SendMessage( GetDlgItem(hDlg,IDC_PATH), CB_INSERTSTRING, 0, (LPARAM) Path );
}
break;
case IDC_EXCLUDE:
idx = ListView_GetSelectionMark( GetDlgItem(hDlg,IDC_LIST) );
if ( idx >= 0 ) {
// make sure enumeration thread has finished with last exclude:
while ( !!g.Exclude && !IsWindowEnabled( GetDlgItem( hDlg, IDC_REFRESH ) ) ) {
Sleep( 100 );
}
HWND hList = GetDlgItem(hDlg,IDC_LIST);
_bstr_t Path = GetTreeItemText( hList, idx, 0 );
// copy path to where enumeration thread can see it:
g.Exclude = Path;
// remove any items with this path
LVFINDINFO find;
find.flags = LVFI_STRING | LVFI_PARTIAL;
find.psz = Path;
idx = -1;
for (;;) {
idx = ListView_FindItem( hList, idx, &find );
if ( idx < 0 )
break;
ListView_DeleteItem( hList, idx );
--idx;
}
}
break;
case IDC_PROPERTIES:
idx = ListView_GetSelectionMark( GetDlgItem(hDlg,IDC_LIST) );
if ( idx >= 0 ) {
HWND hList = GetDlgItem(hDlg,IDC_LIST);
TCHAR Path[ MAX_UNCPATH ];
ListView_GetItemText( hList, idx, 0, Path, MAX_UNCPATH );
ShowFileProperties( hDlg, Path );
}
break;
case IDC_EXPLORE:
idx = ListView_GetSelectionMark( GetDlgItem(hDlg,IDC_LIST) );
if ( idx >= 0 ) {
HWND hList = GetDlgItem(hDlg,IDC_LIST);
TCHAR Path[ MAX_UNCPATH ];
ListView_GetItemText( hList, idx, 0, Path, MAX_UNCPATH );
ExploreFile( hDlg, Path );
}
break;
case IDC_EXPORT:
// get export file name
memset( &open, 0, sizeof open );
open.lStructSize = sizeof open;
open.hwndOwner = hDlg;
open.lpstrFilter = TEXT("Unicode Text (*.txt)\0*.txt\0");
open.lpstrFile = exportPath;
open.nMaxFile = sizeof exportPath / sizeof(TCHAR);
open.Flags = OFN_HIDEREADONLY;
open.lpstrTitle = TEXT("Save as");
if ( ! GetSaveFileName( &open ) )
break;
p = _tcschr( exportPath, 0 );
p -= 4;
if ( p < exportPath || _tcsicmp( p, TEXT(".txt") ) != 0 )
_tcscat( exportPath, TEXT(".txt") );
DeleteFile( exportPath );
ok = ExportFile( GetDlgItem(hDlg,IDC_LIST), exportPath );
if ( ! ok )
MessageBox( hDlg, TEXT("Error exporting settings"), APPNAME, MB_OK|MB_ICONSTOP );
break;
case IDC_COMPARE:
CreateDialogParam( g.hInst, _T("COMPARE"), hDlg, CompareDialog, (LPARAM)g.ShareList );
break;
}
break;
case WM_GETMINMAXINFO:
resizer.OnGetMinMaxInfo( wParam, lParam );
return 0;
case WM_SIZE:
resizer.OnSize( wParam, lParam );
UpdateWindow( hDlg );
return 0;
case WM_NCHITTEST:
return resizer.OnNcHitTest( wParam, lParam );
case WM_PAINT:
resizer.OnPaint( wParam, lParam );
break;
case WM_CLOSE:
SendMessage( hDlg, WM_COMMAND, IDCANCEL, 0 );
SaveListViewColumns( GetDlgItem(hDlg,IDC_LIST));
PostQuitMessage( 0 );
break;
}
return DefWindowProc( hDlg, message, wParam, lParam );
}
//----------------------------------------------------------------------
//
// WinMain
//
// Initialize and start application
//
//----------------------------------------------------------------------
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
#if 0
PrintAll();
return 0;
#endif
// initialize things
InitCommonControls();
CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
g.hInst = hInstance;
// register window class
WNDCLASSEX wndclass = { 0 };
wndclass.cbSize = sizeof wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = MainDialog;
wndclass.hInstance = hInstance;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hIcon = LoadIcon( hInstance, TEXT("APPICON") );
wndclass.hIconSm = LoadIcon( hInstance, TEXT("APPICON") );
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1);
wndclass.lpszClassName = TEXT("ShareEnumClass");
if ( RegisterClassEx( &wndclass ) == 0 )
GetLastError();
g.hMainDlg = CreateDialog( hInstance, TEXT("MAIN"), NULL, (DLGPROC)MainDialog );
if ( g.hMainDlg == NULL ) {
GetLastError();
return 1;
}
// make top window
//SetWindowPos( hMainDlg, HWND_TOP, 1, 1, 0, 0, SWP_NOSIZE );
// Make the window visible
ShowWindow( g.hMainDlg, nCmdShow );
// Paint window
UpdateWindow( g.hMainDlg );
// Keyboard accelerators
HACCEL hAccel = LoadAccelerators( hInstance, TEXT("ACCELERATORS") );
// Message loop
MSG msg;
while ( GetMessage( &msg, NULL, 0, 0 )) {
if ( TranslateAccelerator( g.hMainDlg, hAccel, &msg ) )
continue;
if ( IsDialogMessage( g.hMainDlg, &msg ) )
continue;
// process message
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -