📄 mainwin.cpp
字号:
static char *mainwin_id =
"@(#)Copyright (C) H.Shirouzu 2004-2008 mainwin.cpp ver1.71";
/* ========================================================================
Project Name : Fast/Force copy file and directory
Create : 2004-09-15(Wed)
Update : 2008-02-05(Tue)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include "mainwin.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <richedit.h>
/*=========================================================================
僋儔僗 丗 TFastCopyApp
奣 梫 丗 傾僾儕働乕僔儑儞僋儔僗
愢 柧 丗
拲 堄 丗
=========================================================================*/
TFastCopyApp::TFastCopyApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow) : TApp(_hI, _cmdLine, _nCmdShow)
{
LoadLibrary("RICHED20.DLL");
// LoadLibrary("SHELL32.DLL");
// LoadLibrary("COMCTL32.DLL");
// LoadLibrary("COMDLG32.dll");
}
TFastCopyApp::~TFastCopyApp()
{
}
void TFastCopyApp::InitWindow(void)
{
TRegisterClass(FASTCOPY_CLASS);
TDlg *mainDlg = new TMainDlg();
mainWnd = mainDlg;
mainDlg->Create();
}
int WINAPI WinMain(HINSTANCE _hI, HINSTANCE, LPSTR arg, int show)
{
return TFastCopyApp(_hI, arg, show).Run();
}
/*=========================================================================
僋儔僗 丗 TMainDlg
奣 梫 丗 儊僀儞僟僀傾儘僌
愢 柧 丗
拲 堄 丗
=========================================================================*/
TMainDlg::TMainDlg() : TDlg(MAIN_DIALOG), aboutDlg(this), setupDlg(&cfg, this), shellExtDlg(&cfg, this), jobDlg(&cfg, this)
{
cfg.ReadIni();
if (cfg.lcid > 0)
TSetDefaultLCID(cfg.lcid);
isShellExt = FALSE;
isErrLog = cfg.isErrLog;
isUtf8Log = cfg.isUtf8Log && IS_WINNT_V;
isReparse = cfg.isReparse;
forceStart = cfg.forceStart;
isTaskTray = noConfirmDel = FALSE;
isNetPlaceSrc = FALSE;
skipEmptyDir = cfg.skipEmptyDir;
diskMode = cfg.diskMode;
curForeWnd = NULL;
isErrEditHide = FALSE;
isRunAsStart = FALSE;
isRunAsParent = FALSE;
strcpyV(logFile, cfg.logPath);
// isRegExp = FALSE;
// isFilter = FALSE;
curPriority = ::GetPriorityClass(::GetCurrentProcess());
autoCloseLevel = NO_CLOSE;
curIconIndex = 0;
pathLogBuf = NULL;
isDelay = FALSE;
endTick = 0;
hErrLogFile = INVALID_HANDLE_VALUE;
hErrLogMutex = NULL;
memset(&ti, 0, sizeof(ti));
}
TMainDlg::~TMainDlg()
{
}
struct CopyInfo COPYINFO_LIST [] = {
{ IDS_ALLSKIP, NULL, IDS_CMD_NOEXIST_ONLY, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_NAME },
{ IDS_ATTRCMP, NULL, IDS_CMD_DIFF, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_ATTR },
{ IDS_UPDATECOPY, NULL, IDS_CMD_UPDATE, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_LASTEST },
{ IDS_FORCECOPY, NULL, IDS_CMD_FORCE_COPY, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_ALWAYS },
{ IDS_SYNCCOPY, NULL, IDS_CMD_SYNC, NULL, FastCopy::SYNCCP_MODE, FastCopy::BY_ATTR },
// { IDS_MOVEATTR, NULL, IDS_CMD_MOVE, NULL, FastCopy::MOVE_MODE, FastCopy::BY_ATTR },
{ IDS_MOVEFORCE, NULL, IDS_CMD_MOVE, NULL, FastCopy::MOVE_MODE, FastCopy::BY_ALWAYS },
{ IDS_DELETE, NULL, IDS_CMD_DELETE, NULL, FastCopy::DELETE_MODE, FastCopy::BY_ALWAYS },
{ 0, NULL, 0, NULL, (FastCopy::Mode)0, (FastCopy::OverWrite)0 }
};
void TMainDlg::SetPathHistory(BOOL set_edit)
{
if (GetCopyMode() == FastCopy::DELETE_MODE) {
SetComboBox(SRC_COMBO, cfg.delPathHistory, set_edit);
}
else {
SetComboBox(SRC_COMBO, cfg.srcPathHistory, set_edit);
SetComboBox(DST_COMBO, cfg.dstPathHistory, set_edit);
}
}
void TMainDlg::SetFilterHistory(BOOL set_edit)
{
SetComboBox(INCLUDE_COMBO, cfg.includeHistory, set_edit);
SetComboBox(EXCLUDE_COMBO, cfg.excludeHistory, set_edit);
}
void TMainDlg::SetComboBox(int item, void **history, BOOL set_edit)
{
DWORD len = 0;
WCHAR *wbuf = NULL;
if (!set_edit) {
len = ::GetWindowTextLengthV(GetDlgItem(item));
wbuf = new WCHAR [len + 1];
if (GetDlgItemTextV(item, wbuf, len + 1) != len)
return;
}
SendDlgItemMessage(item, CB_RESETCONTENT, 0, 0);
for (int i=0; i < cfg.maxHistory; i++) {
if (GetChar(history[i], 0))
SendDlgItemMessageV(item, CB_INSERTSTRING, i, (LPARAM)history[i]);
}
if (!set_edit) {
if (!SetDlgItemTextV(item, wbuf)) {
SendDlgItemMessage(item, CB_RESETCONTENT, 0, 0);
}
}
else if (cfg.maxHistory > 0 /* && ::IsWindowEnabled(GetDlgItem(item) */)
SetDlgItemTextV(item, history[0]);
delete [] wbuf;
}
BOOL TMainDlg::SetMiniWindow(void)
{
GetWindowRect(&rect);
int height = rect.bottom - rect.top - (isErrEditHide ? 0 : normalHeight - miniHeight);
isErrEditHide = TRUE;
MoveWindow(rect.left, rect.top, rect.right - rect.left, height, IsWindowVisible());
return TRUE;
}
BOOL TMainDlg::SetNormalWindow(void)
{
if (IsWindowVisible()) {
GetWindowRect(&rect);
int height = rect.bottom - rect.top + (isErrEditHide ? normalHeight - miniHeight : 0);
isErrEditHide = FALSE;
MoveWindow(rect.left, rect.top, rect.right - rect.left, height, TRUE);
}
return TRUE;
}
BOOL TMainDlg::MoveCenter(BOOL isShow)
{
POINT pt;
::GetCursorPos(&pt);
RECT screen_rect = { 0, 0, ::GetSystemMetrics(SM_CXFULLSCREEN), ::GetSystemMetrics(SM_CYFULLSCREEN) };
if (MonitorFromPointV && GetMonitorInfoV) {
HMONITOR hMon;
if ((hMon = ::MonitorFromPointV(pt, MONITOR_DEFAULTTONEAREST)) != NULL) {
MONITORINFO info;
info.cbSize = sizeof(info);
if (::GetMonitorInfoV(hMon, &info) && (info.rcMonitor.right - info.rcMonitor.left) > 0 && (info.rcMonitor.bottom - info.rcMonitor.top) > 0)
screen_rect = info.rcMonitor;
}
}
pt.x = screen_rect.left + ((screen_rect.right - screen_rect.left) - (rect.right - rect.left)) / 2;
pt.y = screen_rect.top + ((screen_rect.bottom - screen_rect.top) - (rect.bottom - rect.top)) / 2;
return SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}
BOOL TMainDlg::SetupWindow()
{
static BOOL once = FALSE;
if (once)
return TRUE;
once = TRUE;
EnableWindow(TRUE);
if (cfg.isTopLevel)
SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);
MoveCenter(TRUE);
SetItemEnable(GetCopyMode() == FastCopy::DELETE_MODE);
SetMiniWindow();
return TRUE;
}
BOOL TMainDlg::EvCreate(LPARAM lParam)
{
// if (IS_WINNT_V && TIsWow64()) {
// DWORD val = 0;
// TWow64DisableWow64FsRedirection(&val);
// }
if (IsWinVista() && TIsUserAnAdmin() && TIsEnableUAC()) {
SetVersionStr(TRUE);
}
char title[100];
sprintf(title, "FastCopy %s", GetVersionStr());
InstallExceptionFilter(title, GetLoadStr(IDS_EXCEPTIONLOG));
SetWindowTitle(title);
if (IsWinVista() && !TIsUserAnAdmin()) {
if (cfg.isRunasButton) {
HWND hRunas = GetDlgItem(RUNAS_BUTTON);
::SetWindowLong(hRunas, GWL_STYLE, ::GetWindowLong(hRunas, GWL_STYLE) | WS_VISIBLE);
::SendMessage(hRunas, BCM_SETSHIELD, 0, 1);
}
else {
::SetMenu(hWnd, ::LoadMenu(TApp::GetInstance(), (LPCSTR)MAIN_RUNAS_MENU));
}
if (TIsEnableUAC() && TIsVirtualizedDir(cfg.execDir)) {
::InsertMenu(::GetSubMenu(::GetMenu(hWnd), 0), 0, MF_STRING|MF_BYPOSITION, USERDIR_MENUITEM, GetLoadStr(IDS_USERDIR_MENU));
}
}
int i;
for (i=0; i < MAX_FASTCOPY_ICON; i++)
hMainIcon[i] = ::LoadIcon(TApp::GetInstance(), (LPCSTR)(FASTCOPY_ICON + i));
::SetClassLong(hWnd, GCL_HICON, (LONG)hMainIcon[FCNORMAL_ICON_INDEX]);
hAccel = LoadAccelerators(TApp::GetInstance(), (LPCSTR)IDR_ACCEL);
SetSize();
TaskBarCreateMsg = ::RegisterWindowMessage("TaskbarCreated");
// 儊僢僙乕僕僙僢僩
SetDlgItemText(STATUS_EDIT, GetLoadStr(IDS_BEHAVIOR));
SetDlgItemInt(BUFSIZE_EDIT, cfg.bufSize);
// 僐僺乕儌乕僪儕僗僩嶌惉
for (i=0; COPYINFO_LIST[i].resId; i++) {
COPYINFO_LIST[i].list_str = GetLoadStr(COPYINFO_LIST[i].resId);
SendDlgItemMessage(MODE_COMBO, CB_ADDSTRING, 0, (LPARAM)COPYINFO_LIST[i].list_str);
COPYINFO_LIST[i].cmdline_name = GetLoadStrV(COPYINFO_LIST[i].cmdline_resId);
}
UpdateMenu();
// 僐僺乕儌乕僪儕僗僩偺僨僼僅儖僩慖戰
SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, cfg.copyMode, 0);
CheckDlgButton(IGNORE_CHECK, cfg.ignoreErr);
CheckDlgButton(ESTIMATE_CHECK, cfg.estimateMode);
CheckDlgButton(TOPLEVEL_CHECK, cfg.isTopLevel);
CheckDlgButton(OWDEL_CHECK, cfg.enableOwdel);
CheckDlgButton(ACL_CHECK, cfg.enableAcl && IS_WINNT_V);
CheckDlgButton(STREAM_CHECK, cfg.enableStream && IS_WINNT_V);
SendDlgItemMessage(STATUS_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
// SendDlgItemMessage(ERR_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
SendDlgItemMessage(ERR_EDIT, EM_SETTARGETDEVICE, 0, 0); // 愜傝曉偟
SendDlgItemMessage(ERR_EDIT, EM_LIMITTEXT, 0, 0);
SendDlgItemMessage(PATH_EDIT, EM_LIMITTEXT, 0, 0);
// 僗儔僀僟僐儞僩儘乕儖
SendDlgItemMessage(SPEED_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(SPEED_SUSPEND, SPEED_FULL));
SetSpeedLevelLabel(this, speedLevel = cfg.speedLevel);
// 棜楌僙僢僩
SetPathHistory(TRUE);
SetFilterHistory(FALSE);
RECT path_rect, err_rect;
GetWindowRect(&rect);
::GetWindowRect(GetDlgItem(PATH_EDIT), &path_rect);
::GetWindowRect(GetDlgItem(ERR_EDIT), &err_rect);
SendDlgItemMessage(PATH_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
SendDlgItemMessage(ERR_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
normalHeight = rect.bottom - rect.top;
miniHeight = normalHeight - (err_rect.bottom - path_rect.bottom);
int argc;
void **argv;
argv = CommandLineToArgvV(::GetCommandLineV(), &argc);
// command line mode
if (argc > 1) {
// isRunAsParent 偺応崌偼丄Child懁偐傜偺 CLOSE 傪懸偮偨傔丄帺庡廔椆偟側偄
if (!CommandLineExecV(argc, argv) && (!isShellExt || autoCloseLevel >= NOERR_CLOSE) && !isRunAsParent) {
if ((::GetAsyncKeyState(VK_SHIFT) & 0x8000))
autoCloseLevel = NO_CLOSE;
else
PostMessage(WM_CLOSE, 0, 0);
}
}
else
Show();
return TRUE;
}
BOOL TMainDlg::EvNcDestroy(void)
{
TaskTray(NIM_DELETE);
PostQuitMessage(0);
return TRUE;
}
BOOL TMainDlg::CancelCopy()
{
if (!isDelay)
fastCopy.Suspend();
::KillTimer(hWnd, FASTCOPY_TIMER);
int ret = TMsgBox(this).Exec(GetLoadStr(IsListing() ? IDS_LISTCONFIRM : info.mode == FastCopy::DELETE_MODE ? IDS_DELSTOPCONFIRM : IDS_STOPCONFIRM), FASTCOPY, MB_OKCANCEL);
if (isDelay) {
isDelay = FALSE;
EndCopy();
}
else {
fastCopy.Resume();
if (ret == IDOK)
fastCopy.Aborting();
else
::SetTimer(hWnd, FASTCOPY_TIMER, 1000, NULL);
}
return ret == IDOK ? TRUE : FALSE;
}
BOOL TMainDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID) {
case IDOK: case LIST_BUTTON:
if (!fastCopy.IsStarting() && !isDelay) {
if ((::GetTickCount() - endTick) > 1000)
ExecCopy(wID == LIST_BUTTON ? LISTING_EXEC : NORMAL_EXEC);
}
else if (CancelCopy()) {
autoCloseLevel = NO_CLOSE;
}
return TRUE;
case IDCANCEL: case CLOSE_MENUITEM:
if (!fastCopy.IsStarting()) {
EndDialog(wID);
}
else if (fastCopy.IsAborting()) {
if (TMsgBox(this).Exec(GetLoadStr(IDS_CONFIRMFORCEEND), FASTCOPY, MB_OKCANCEL) == IDOK)
EndDialog(wID);
}
else {
CancelCopy();
autoCloseLevel = NOERR_CLOSE;
}
return TRUE;
case ATONCE_BUTTON:
isDelay = FALSE;
::KillTimer(hWnd, FASTCOPY_TIMER);
ExecCopyCore();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -