Skip to content

Commit 21dcc9a

Browse files
authored
Merge pull request #1 from KondeU/dev
AutoDiskCopier v3.0 合入
2 parents f74243f + da5cd4e commit 21dcc9a

22 files changed

Lines changed: 1892 additions & 1 deletion

AutoDiskCopier_v3/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
build
2+
*.aps

AutoDiskCopier_v3/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
project(AutoDiskCopier)
3+
4+
set(CMAKE_CXX_STANDARD 14)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_CXX_EXTENSIONS OFF)
7+
8+
file(GLOB_RECURSE INC src/*.h)
9+
file(GLOB_RECURSE SRC src/*.cpp)
10+
file(GLOB_RECURSE RES src/*.rc)
11+
12+
add_executable(AutoDiskCopier WIN32 ${SRC} ${INC} ${RES})

AutoDiskCopier_v3/build.bat

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
cd %~dp0
2+
3+
set BUILD_BITS=%1
4+
set BUILD_TYPE=%2
5+
set BUILD_COMPILE=%3
6+
7+
rem script params: build.bat [BUILD_BITS] [BUILD_TYPE] [BUILD_COMPILE]
8+
rem default value: BUILD_BITS=x86 BUILD_TYPE=Release BUILD_COMPILE=VS2015
9+
10+
if "%BUILD_TYPE%"=="" (set BUILD_TYPE=Release)
11+
if "%BUILD_COMPILE%"=="" (set BUILD_COMPILE=VS2017)
12+
13+
if "%BUILD_COMPILE%"=="VS2015" (set BUILD_COMPILE=Visual Studio 14 2015)
14+
if "%BUILD_COMPILE%"=="VS2017" (set BUILD_COMPILE=Visual Studio 15 2017)
15+
if "%BUILD_COMPILE%"=="VS2019" (set BUILD_COMPILE=Visual Studio 16 2019)
16+
17+
rem only VS2019 uses "BUILD_ARCH_ARG"
18+
set BUILD_ARCH_ARG=
19+
if "%BUILD_COMPILE%"=="Visual Studio 16 2019" (
20+
if "%BUILD_BITS%"=="x64" (set BUILD_ARCH_ARG=-A x64) ^
21+
else (set BUILD_ARCH_ARG=-A Win32)
22+
) else (
23+
if "%BUILD_BITS%"=="x64" (set BUILD_COMPILE=%BUILD_COMPILE% Win64)
24+
)
25+
26+
mkdir build
27+
cd build
28+
cmake -G "%BUILD_COMPILE%" %BUILD_ARCH_ARG% ..
29+
cmake --build . --config %BUILD_TYPE% -j 8 -- /p:CharacterSet=Unicode
30+
cd ..

AutoDiskCopier_v3/clean.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rd %~dp0build /S /Q

AutoDiskCopier_v3/config.bat

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
:: Manually configure the local environment.
2+
3+
PATH=D:\CMake\cmake-3.16.0-win64-x64\bin;%PATH%
4+
PATH=D:\CMake\cmake-3.19.8-win64-x64\bin;%PATH%
5+
echo Env PATH: %PATH%
6+
7+
:: The version of CMake finally used:
8+
cmake --version
9+
10+
:: The default build uses VS2015, if we have a higher version of VS,
11+
:: use the higher version of MSBuild to build, then we need to add
12+
:: the path of MSBuild.exe to the environment PATH.
13+
:: And we need to install vc140 compatible compile and build tools.
14+
PATH=D:\VS\2017\Enterprise\MSBuild\15.0\Bin;%PATH%
Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,280 @@
1+
#include"AutoDiskCopier.h"
2+
3+
#pragma comment(linker, \
4+
"/manifestdependency:\"" \
5+
"type='win32' " \
6+
"name='Microsoft.Windows.Common-Controls' " \
7+
"version='6.0.0.0' " \
8+
"processorArchitecture='*' " \
9+
"publicKeyToken='6595b64144ccf1df' " \
10+
"language='*'\"")
11+
12+
static const TCHAR szAppNameEng[] = TEXT("AutoDiskCopier");
13+
static const TCHAR szAppNameChn[] = TEXT("自动磁盘拷贝器");
14+
15+
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
16+
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
17+
18+
19+
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT iCmdShow)
20+
{
21+
//--- Create a no show window to get other msg. ---//
22+
23+
HWND hwnd;
24+
MSG msg;
25+
WNDCLASS wndclass;
26+
memset(&hwnd, 0, sizeof(HWND));
27+
memset(&msg, 0, sizeof(MSG));
28+
memset(&wndclass, 0, sizeof(WNDCLASS));
29+
30+
wndclass.style = CS_HREDRAW | CS_VREDRAW;
31+
wndclass.lpfnWndProc = WndProc;
32+
wndclass.cbClsExtra = 0;
33+
wndclass.cbWndExtra = 0;
34+
wndclass.hInstance = hInstance;
35+
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
36+
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
37+
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
38+
wndclass.lpszMenuName = NULL;
39+
wndclass.lpszClassName = szAppNameEng;
40+
41+
if (!RegisterClass(&wndclass))
42+
{
43+
MessageBox(NULL, TEXT("错误:主窗口类注册失败,该应用程序最低版本限制为WindowsNT!"), szAppNameChn, MB_ICONERROR | MB_OK);
44+
return 0;
45+
}
46+
47+
hwnd = CreateWindow(
48+
szAppNameEng, szAppNameChn, WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME,
49+
0, 0, 0, 0, GetDesktopWindow(), NULL, hInstance, NULL);
50+
51+
//--- Program init. ---//
52+
53+
//Accel.
54+
55+
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
56+
57+
//--- Message loop. ---//
58+
59+
while (GetMessage(&msg, NULL, 0, 0))
60+
{
61+
if (TranslateAccelerator(hwnd, hAccel, &msg))
62+
{
63+
continue;
64+
}
65+
TranslateMessage(&msg);
66+
DispatchMessage(&msg);
67+
}
68+
69+
//--- Program end. ---//
70+
71+
return (int)msg.wParam;
72+
}
73+
74+
75+
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
76+
{
77+
static CAutoDiskCopier adc(hwnd);
78+
79+
static HWND hDlgMain = NULL;
80+
81+
switch (message)
82+
{
83+
84+
case WM_CREATE:
85+
86+
hDlgMain = CreateDialogParam(
87+
((CREATESTRUCT*)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG),
88+
hwnd, DlgProc, (LPARAM)(&adc));
89+
90+
//热键启动(Control + Alt + Shift + U)
91+
RegisterHotKey(hwnd, 0, MOD_CONTROL | MOD_ALT | MOD_SHIFT, 'U');
92+
93+
//托盘图标
94+
adc.m_ni.SetTip(TEXT("AutoDiskCopier v3.0"));
95+
adc.m_ni.SetIcon(((CREATESTRUCT*)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON));
96+
97+
if (adc.m_bEnableNotifyIcon)
98+
{
99+
adc.m_ni.AddNotificationIcon();
100+
}
101+
102+
return 0;
103+
104+
105+
case WM_COMMAND:
106+
107+
switch (LOWORD(wParam))
108+
{
109+
case IDR_ACCELERATOR_HIDE:
110+
SendMessage(hDlgMain, WM_COMMAND, wParam, lParam);
111+
}
112+
break;
113+
114+
case WM_HOTKEY:
115+
116+
ShowWindow(hDlgMain, SW_NORMAL);
117+
return 0;
118+
119+
120+
case WM_NOTIFYICON:
121+
122+
if (wParam == IDI_ICON && lParam == WM_RBUTTONDBLCLK)
123+
{
124+
adc.m_ni.DeleteNotificationIcon();
125+
ShowWindow(hDlgMain, SW_SHOWNORMAL);
126+
}
127+
break;
128+
129+
130+
case WM_DEVICECHANGE:
131+
132+
if ((DBT_DEVICEARRIVAL != wParam) ||
133+
(DBT_DEVTYP_VOLUME != ((PDEV_BROADCAST_HDR)lParam)->dbch_devicetype))
134+
{
135+
//忽略设备安装不成功或非逻辑磁盘的消息
136+
return BROADCAST_QUERY_DENY;
137+
}
138+
else
139+
{
140+
DWORD dwDiskMask = ((PDEV_BROADCAST_VOLUME)lParam)->dbcv_unitmask;
141+
UINT uiPos = 0;
142+
TCHAR szCopyDiskPath[4];
143+
144+
for (uiPos = 0; !(dwDiskMask & 1); uiPos++)
145+
{
146+
dwDiskMask >>= 1;
147+
}
148+
149+
if (uiPos >= 26)
150+
{
151+
//磁盘盘符超标
152+
return BROADCAST_QUERY_DENY;
153+
}
154+
else
155+
{
156+
wsprintf(szCopyDiskPath, TEXT("%c%s"), 'A' + uiPos, TEXT(":\\"));
157+
}
158+
159+
adc.Copying(szCopyDiskPath);
160+
161+
return TRUE;
162+
}
163+
164+
165+
case WM_DESTROY:
166+
167+
PostQuitMessage(0);
168+
return 0;
169+
}
170+
171+
return DefWindowProc(hwnd, message, wParam, lParam);
172+
}
173+
174+
175+
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
176+
{
177+
static CAutoDiskCopier * padc;
178+
179+
switch (message)
180+
{
181+
case WM_INITDIALOG:
182+
padc = (CAutoDiskCopier *)lParam;
183+
padc->SetDlgInfo(hDlg);
184+
padc->m_bfdlg.SetOwnerWindow(hDlg);
185+
padc->m_osdlg.SetOwnerWindow(hDlg);
186+
padc->m_osdlg.SetFilter(2, TEXT("签名文件(*.key)"), TEXT("*.key"), TEXT("所有文件(*.*)"), TEXT("*.*"));
187+
padc->m_osdlg.SetDefExt(TEXT("key"));
188+
return TRUE;
189+
190+
case WM_COMMAND:
191+
switch (LOWORD(wParam))
192+
{
193+
case IDCANCEL:
194+
case IDC_BTN_HIDE:
195+
case IDR_ACCELERATOR_HIDE:
196+
ShowWindow(hDlg, SW_HIDE);
197+
if (padc->m_bEnableNotifyIcon)
198+
{
199+
padc->m_ni.AddNotificationIcon();
200+
}
201+
return TRUE;
202+
203+
case IDC_BTN_QUIT:
204+
SendMessage(GetParent(hDlg), WM_DESTROY, 0, 0);
205+
return TRUE;
206+
207+
case IDC_BTN_SAVESETTING:
208+
padc->GetDlgInfo(hDlg);
209+
padc->RegisterAutorun(hDlg); // 注册失败时会自动更改标记
210+
padc->SetDlgInfo(hDlg); // 因此重新获取一遍标记再SaveSetting
211+
padc->SaveSetting(hDlg);
212+
return TRUE;
213+
214+
case IDC_BTN_BROWSECOPYFILEPATH:
215+
if (padc->m_bfdlg.CmmDlgBrowse())
216+
{
217+
TCHAR szPath[MAX_PATH];
218+
wsprintf(szPath, TEXT("%s%s"), padc->m_bfdlg.GetDir(), TEXT("\\"));
219+
SetDlgItemText(hDlg, IDC_EDIT_COPYFILEPATH, szPath);
220+
}
221+
return TRUE;
222+
223+
case IDC_BTN_CREATEKEYFILE:
224+
if(padc->m_osdlg.CmnDlgSaveFile())
225+
{
226+
HANDLE hFile = CreateFile(padc->m_osdlg.GetFilePath(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
227+
if (INVALID_HANDLE_VALUE == hFile)
228+
{
229+
MessageBox(hDlg, TEXT("生成签名文件失败!"), TEXT("ADC - 签名"), MB_ICONERROR);
230+
}
231+
else
232+
{
233+
int iRand[2];
234+
char szMD5[33];
235+
for (UINT ui = 0; ui < 2; ui++)
236+
{
237+
srand(GetTickCount());
238+
iRand[ui] = rand();
239+
240+
padc->m_md5.CalcMD5((void *)(&iRand[ui]), sizeof(int));
241+
padc->m_md5.GetMD5(szMD5);
242+
padc->m_md5.Reset();
243+
244+
DWORD dwWrited;
245+
WriteFile(hFile, szMD5, 32 * sizeof(char), &dwWrited, NULL);
246+
}
247+
248+
CloseHandle(hFile);
249+
MessageBox(hDlg, TEXT("已生成签名文件。"), TEXT("ADC - 签名"), MB_OK);
250+
}
251+
}
252+
return TRUE;
253+
254+
case IDC_BTN_BROWSEKEYFILEPATH:
255+
if (padc->m_osdlg.CmnDlgOpenFile())
256+
{
257+
SetDlgItemText(hDlg, IDC_EDIT_KEYFILEPATH, padc->m_osdlg.GetFilePath());
258+
}
259+
return TRUE;
260+
}
261+
break;
262+
263+
case WM_NOTIFY:
264+
switch (((LPNMHDR)lParam)->code)
265+
{
266+
case NM_CLICK:
267+
case NM_RETURN:
268+
{
269+
PNMLINK pnmLink = (PNMLINK)lParam;
270+
if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hDlg, IDC_SYSLINK))
271+
{
272+
ShellExecute(NULL, TEXT("open"), TEXT("https://github.com/KondeU/AutoDiskCopier"), NULL, NULL, SW_SHOW);
273+
return TRUE;
274+
}
275+
}
276+
}
277+
break;
278+
}
279+
return FALSE;
280+
}

0 commit comments

Comments
 (0)