//#######################################################################################// Copyright(c) Vision Technologies 2002 All Rights Reserved.//// Project Name: FileInspector RT// Software Version 1.0//// ----------------------------------------------------------//// File Name: FileInspector.h// Function: Define of Classes// Created Time: 28th Dec, 2002// Author: HighTech Young//// ----------------------------------------------------------//// Revidion Time: // Revision By: // Revision Contents: ////#######################################################################################
#include "resource.h"#include "stdafx.h"#include "afxmt.h"
//---------------------------------------------------------------------------------------//// COMMENTS: Define of applacation class ////---------------------------------------------------------------------------------------
class CMyApp : public CWinApp{public: virtual BOOL InitInstance ();};
//---------------------------------------------------------------------------------------//// COMMENTS: Define of mainwindow class////---------------------------------------------------------------------------------------
class CMainWindow : public CWnd{ // // Declare all objects of interface //private: CStatic m_FiTip; CButton m_GroupBoxFI; CEdit m_ObjectPath; CButton m_Browse;
CButton m_GroupBoxFS; CStatic m_FsTip; CEdit m_ObjectSize; CButton m_GB; CButton m_MB; CButton m_KB; CButton m_Byte;
CButton m_OK; CButton m_Cancel; CButton m_Exit;
public: CMainWindow ();
BOOL boolWndHadShow; // Window display indicator
protected: CEvent m_eventStopWatch;// CEvent object for synchonize thread
virtual void PostNcDestroy();
// // Message handler declare // afx_msg int OnCreate(LPCREATESTRUCT lpcs); afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg LRESULT OnMyIconNotify(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnShowAppIconic(WPARAM wParam, LPARAM lParam); afx_msg void OnClose();
afx_msg void OnBrowseButonClicked(); afx_msg void OnObjectPathChanged(); afx_msg void OnOkButtonClicked(); afx_msg void OnCancelButtonClicked(); afx_msg void OnExitButtonClicked();
afx_msg LONG OnFileChanged(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP ()};
//##################################### End of File #######################################
//#######################################################################################// Copyright(c) Vision Technologies 2002 All Rights Reserved.//// Project Name: FileInspector RT// Software Version 1.0//// ----------------------------------------------------------//// File Name: FileInspector.cpp// Function: Implementation of the class// Created Time: 28th Dec, 2002// Created by: HighTech Young//// ----------------------------------------------------------//// Revidion Time: // Revision By: // Revision Contents: ////#######################################################################################
#include "FileInspector.h"
//---------------------------------------------------------------------------------------//// COMMENTS: GLOBE DEFINATION AREA////---------------------------------------------------------------------------------------
//// User defined message for callback function//
#define USER_WM_NOTIFYICON WM_USER + 0x001
//// User defined message for display icon on statue bar of windows//
#define USER_WM_SHOWAPPICONIC WM_USER + 0x002
//// User defined message for file change notification//
#define WM_USER_THREAD_FILE_CHANGED WM_USER + 0x003
//// The structure was defined for the input of thread function parameters//
typedef struct tagTHREADPARAM{ HWND hWnd; CEvent *pEvent;}THREADPARAM;
//// Worker thread function declare//
UINT ThreadFunction(LPVOID pParam);
//---------------------------------------------------------------------------------------//// COMMENTS: MESSAGE MAP of CMainWindow class////---------------------------------------------------------------------------------------
BEGIN_MESSAGE_MAP (CMainWindow, CWnd) ON_WM_CREATE() ON_MESSAGE(USER_WM_NOTIFYICON,OnMyIconNotify) ON_MESSAGE(USER_WM_SHOWAPPICONIC,OnShowAppIconic) ON_WM_SYSCOMMAND() ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BROWSE,OnBrowseButonClicked) ON_EN_CHANGE(IDE_OBJ_PATH,OnObjectPathChanged) ON_BN_CLICKED(IDC_OK,OnOkButtonClicked) ON_BN_CLICKED(IDE_OBJ_PATH,OnObjectPathChanged) ON_BN_CLICKED(IDC_EXIT_FI,OnExitButtonClicked)
ON_MESSAGE(WM_USER_THREAD_FILE_CHANGED,OnFileChanged)END_MESSAGE_MAP ()
//// defination of application object//
CMyApp myApp;
//---------------------------------------------------------------------------------------//// FUNCTION: BOOL CMyApp::InitInstance ()// PURPOSE: CMyApp member functions// COMMENTS:////---------------------------------------------------------------------------------------
BOOL CMyApp::InitInstance (){ m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow ();
// // Send MYWM_SHOWAPPICONIC so that the window can be // hide after programe runed and the icon should be // displayed on the statue area of task bar //
m_pMainWnd -> PostMessage( USER_WM_SHOWAPPICONIC ); return TRUE;}
//---------------------------------------------------------------------------------------//// FUNCTION: CMainWindow::CMainWindow ()// PURPOSE: The constructor of the CMainWindow class// COMMENTS:////---------------------------------------------------------------------------------------
CMainWindow::CMainWindow (): m_eventStopWatch(FALSE,TRUE){ // // Register a WNDCLASS. //
CString strWndClass = AfxRegisterWndClass ( CS_DBLCLKS, // Class style AfxGetApp ()->LoadStandardCursor (IDC_ARROW), // Class cursor (HBRUSH) (COLOR_3DFACE + 1), // Background brush AfxGetApp ()->LoadIcon( IDR_FILE_INSPECTOR) // Class icon );
// // Create a window. //
CreateEx (0, strWndClass, _T ("File/Folder Supervisor"), WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL);
// // Size the window. // CRect rect (80,70, 452, 400); CalcWindowRect (&rect);
SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (), SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
}
//---------------------------------------------------------------------------------------//// FUNCTION: int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)// PURPOSE: Create GUI of Programe// COMMENTS:////---------------------------------------------------------------------------------------
int CMainWindow::OnCreate(LPCREATESTRUCT lpcs){ if(CWnd::OnCreate(lpcs) == -1) return -1;
// // Object selected groupe box //
m_GroupBoxFI.Create (_T (" Supervised Target:"), WS_CHILD|BS_GROUPBOX| WS_VISIBLE, CRect(10,10,360,115), this, IDC_GROUPBOX_FI); m_FiTip.Create(_T("Please select the file or folder which you want to ask the File/Folder Supervisor supervise."), WS_CHILD|WS_VISIBLE, CRect(25,35,350,75), this, IDS_FI_TIP); m_ObjectPath.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL, CRect(25,80,260,100), this, IDE_OBJ_PATH); m_Browse.Create(_T("Browse.."), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(265,80,350,100), this, IDC_BROWSE); // // File size limitation config box //
m_GroupBoxFS.Create (_T ("File Size Limitation:"), WS_CHILD |BS_GROUPBOX| WS_VISIBLE, CRect(10,120,360,280), this, IDC_GROUPBOX_FS); m_FsTip.Create( _T("The Folder or File size must be less than:"), WS_CHILD|WS_VISIBLE, CRect(25,145,350,165), this, IDS_FS_TIP); m_ObjectSize.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL, CRect(30,170,100,190), this, IDE_OBJ_SIZE);
m_GB.Create (_T("GB"), WS_CHILD|WS_GROUP|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(110,170,150,190), this, IDC_GB); m_MB.Create (_T("MB"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(155,170,195,190), this, IDC_MB); m_KB.Create (_T("KB"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(200,170,240,190), this, IDC_GB); m_Byte.Create (_T("Byte"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, CRect(245,170,325,190), this, IDC_BYTE); m_KB.SetCheck (BST_CHECKED);
// // Buttons //
m_OK.Create(_T("Start"), WS_CHILD|WS_GROUP|BS_DEFPUSHBUTTON| WS_VISIBLE, CRect(50,290,150,315), this, IDC_OK); m_Cancel.Create(_T("Cancel"), WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE, CRect(155,290,255,315), this, IDC_CANCEL); m_Cancel.EnableWindow(FALSE);
m_Exit.Create(_T("Stop"), WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE, CRect(260,290,360,315), this, IDC_EXIT_FI);
return 0;}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::PostNcDestroy()// PURPOSE: PostNcDestroy will be used for delete the window// COMMENTS:////---------------------------------------------------------------------------------------
void CMainWindow::PostNcDestroy(){ delete this;}
//---------------------------------------------------------------------------------------//// FUNCTION: BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip) // PURPOSE: Add icon in the statu area on the task bar // COMMENTS:////---------------------------------------------------------------------------------------
BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip) { BOOL bResult; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID; tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; tnid.uCallbackMessage = USER_WM_NOTIFYICON; // Callback message tnid.hIcon = hicon; // Icon used if (lpszTip) lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); else tnid.szTip[0] = '/0';
// // Send NIM_ADD to create icon //
bResult = Shell_NotifyIcon(NIM_ADD, &tnid); if (hicon) DestroyIcon(hicon);
return bResult; }
//---------------------------------------------------------------------------------------//// FUNCTION: BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) // PURPOSE: DELETE icon in the statu area on the task bar// COMMENTS:////---------------------------------------------------------------------------------------
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) { BOOL bResult; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID;
// //Send NIM_DELETE to create icon //
bResult = Shell_NotifyIcon(NIM_DELETE, &tnid);
return bResult; }
//---------------------------------------------------------------------------------------//// FUNCTION: LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )// PURPOSE: Call back function of message MYWM_NOTIFYICON// COMMENTS:////---------------------------------------------------------------------------------------
LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam ){ UINT nID; UINT uMouseMsg; nID = (UINT)wParam; uMouseMsg = (UINT) lParam; // // Show or hide window // if (uMouseMsg == WM_LBUTTONDOWN) // Click on icon { if ( boolWndHadShow ) ShowWindow( SW_HIDE ); else ShowWindow( SW_SHOWNORMAL ); boolWndHadShow = ~boolWndHadShow; } return TRUE;}
//---------------------------------------------------------------------------------------//// FUNCTION:// LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )// PURPOSE:// Message handler of show icon on statu bar // and hide the window when programe run// COMMENTS:// Call back function of message MYWM_SHOWAPPICONIC////---------------------------------------------------------------------------------------
LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam ){ HICON theIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_FILE_INSPECTOR) ); MyTaskBarAddIcon(GetSafeHwnd(), 100, theIcon, _T("File/Folder Supervisor")); ShowWindow( SW_HIDE ); boolWndHadShow = FALSE; return 1;}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnClose() // PURPOSE:// When you want to close programe, the icon should// be delete from statue area on task bar,// We can use WM_CLOSE message and message handler to do this// COMMENTS:////---------------------------------------------------------------------------------------
void CMainWindow::OnClose() { // // Add your message handler code here and/or call default // MyTaskBarDeleteIcon( GetSafeHwnd(), 100 ); CWnd::OnClose();}
//---------------------------------------------------------------------------------------//// FUNCTION:// void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )// PURPOSE:// When window were minimumized, the window should be hide, // we use ON_SYSCOMMAND message and message handle to do this// COMMENTS:////---------------------------------------------------------------------------------------void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam ){ if ( nID==SC_MINIMIZE ) { ShowWindow( SW_HIDE ); boolWndHadShow = FALSE; } else CWnd::OnSysCommand( nID, lParam );}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnBrowseButonClicked ()// PURPOSE: Message handler of OK button// COMMENTS:////---------------------------------------------------------------------------------------void CMainWindow::OnBrowseButonClicked (){
// // Must call IMalloc::Free to free the memory by this pointer // LPMALLOC pMalloc; BROWSEINFO bi; char pszDirName[MAX_PATH];// Save the directory name LPITEMIDLIST pidl;
// // If retrieve a handle to the Shell allocator's IMalloc interface sucessfuly // if (SUCCEEDED(SHGetMalloc(&pMalloc))) { ZeroMemory(&bi,sizeof(bi)); bi.hwndOwner = GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = pszDirName; bi.lpszTitle = _T("Select the file or folder which will be Supervised:"); bi.ulFlags = BIF_BROWSEINCLUDEFILES; bi.lpfn = NULL; bi.lParam = 0; if ((pidl = ::SHBrowseForFolder(&bi)) != NULL) { // // Get full path user selected // if (::SHGetPathFromIDList(pidl, pszDirName)) m_ObjectPath.SetWindowText(pszDirName); } pMalloc->Free(pidl); pMalloc->Release(); } // // Try to detect the inspect object is directory or file // Can also use: // DWORD GetFileAttributes(LPCTSTR lpFileName); // DWORD ObjectType; ObjectType = GetFileAttributes(pszDirName); if(ObjectType & FILE_ATTRIBUTE_DIRECTORY) { m_GroupBoxFI.SetWindowText (_T("Folder Supervised:")); m_GroupBoxFS.SetWindowText (_T("Folder Size Limitation")); } else { m_GroupBoxFI.SetWindowText (_T("File Supervised:")); m_GroupBoxFS.SetWindowText (_T("File Size Limitation")); } // //Enable the Cancel button // m_Cancel.EnableWindow(TRUE);}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnOkButtonClicked ()// PURPOSE: Message handler of OK button// COMMENTS:// This function transfer a structure's pointer // as a LPVOID parameter to worker thread. this is the normal way// to handle the worker thread parameters. Besides, you can also// input a address of an object directly.////---------------------------------------------------------------------------------------
void CMainWindow::OnOkButtonClicked (){ m_Cancel.EnableWindow( FALSE ); ShowWindow( SW_HIDE ); boolWndHadShow = FALSE; // // Reset the manual event object before start worker thread //
m_eventStopWatch.ResetEvent ();
// // Prepare the parameter for worker thread // sometimes if you only need m_hWnd, you can also // input &m_hWnd directly there //
THREADPARAM * pThreadParam=new THREADPARAM; pThreadParam->hWnd= m_hWnd; // Message target pThreadParam->pEvent = &m_eventStopWatch; // Event to stop thread // // Start File Inspector thread. // AfxBeginThread(ThreadFunction, pThreadParam);}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnCancelButtonClicked ()// PURPOSE: Message handler of Cancel button// COMMENTS:////---------------------------------------------------------------------------------------
void CMainWindow::OnCancelButtonClicked (){ ShowWindow( SW_HIDE ); boolWndHadShow = FALSE;}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnExitButtonClicked ()// PURPOSE: Message handler of Exit button// COMMENTS:////---------------------------------------------------------------------------------------
void CMainWindow::OnExitButtonClicked (){ ShowWindow( SW_HIDE ); boolWndHadShow = FALSE; m_eventStopWatch.SetEvent();
// // Close the window // PostMessage (WM_CLOSE,0,0);}
//---------------------------------------------------------------------------------------//// FUNCTION: void CMainWindow::OnObjectPathChanged ()// PURPOSE: Message handler of Object Path changed// COMMENTS:////---------------------------------------------------------------------------------------
void CMainWindow::OnObjectPathChanged (){ m_Cancel.EnableWindow(TRUE);}
//---------------------------------------------------------------------------------------// // FUNCTION: UINT ThreadFunction(LPVOID pParam)// PURPOSE: Worker thread Function// COMMENTS:////---------------------------------------------------------------------------------------
UINT ThreadFunction(LPVOID pParam){ // // Unbound the parameters //
THREADPARAM *pThreadParam = (THREADPARAM * ) pParam; HWND hWnd = pThreadParam -> hWnd; CEvent *pEvent = pThreadParam -> pEvent; //delete pThreadParam; delete pThreadParam;
DWORD dwWaitStatus; HANDLE *dwChangeHandles=new HANDLE[3];
// // Use this event handle to stop the thread //
dwChangeHandles[2] = pEvent->m_hObject;
// // Watch the C:/ directory for file creation and deletion. // dwChangeHandles[0] = FindFirstChangeNotification( "C://", // directory to watch FALSE, // do not watch the subtree FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
// // Watch the D:/ subtree for directory creation and deletion. // dwChangeHandles[1] = FindFirstChangeNotification( "D://", // directory to watch TRUE, // watch the subtree FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir. name changes
while (TRUE) { /*-------------------------------------------------------------------------- Examples: Here is the examples if you want to use WaitForSingleObject to imply the function. // // Check if user want to Exit File Inspector. // Please make sure that the second parameter of // WaitForSingleObject is 0, and in this case the // first parameter must be manual event. // WaitForSingleObject will check the first parameter, // if it is signaled,the loop will break. // if(WaitForSingleObject(pEvent->m_hObject,0)==WAIT_OBJECT_0) return (UINT) -1;
WaitForSingleObject(dwChangeHandles[1],INFINITE); PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0); FindNextChangeNotification(dwChangeHandles); ---------------------------------------------------------------------------*/ // // Wait for notification. // dwWaitStatus = WaitForMultipleObjects(3, dwChangeHandles, FALSE, INFINITE); if (dwWaitStatus == WAIT_OBJECT_0 + 2) return (UINT) -1;
switch (dwWaitStatus) { case WAIT_OBJECT_0: // // A file was created or deleted in C:/WINDOWS. // Refresh this directory and restart the // change notification. RefreshDirectory is an // application-defined function. // PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0); FindNextChangeNotification(dwChangeHandles[0]); break;
case WAIT_OBJECT_0 + 1: // // A directory was created or deleted in C:/. // Refresh the directory tree and restart the // change notification. RefreshTree is an // application-defined function. //
PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0); FindNextChangeNotification( dwChangeHandles[1]); break; } }
delete[] dwChangeHandles; return 0;}
//---------------------------------------------------------------------------------------//// FUNCTION: LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)// PURPOSE:// COMMENTS://---------------------------------------------------------------------------------------
LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam){ // // Add process sentence if file changed here. //
return 0;}
//##################################### End of File #######################################