📄 touch.dpr
字号:
program Touch;
{$R Touch.res}
uses Windows, Messages, ShellAPI;
const
// 模板资源ID
IDD_TOUCH = 103;
// 图标资源ID
IDI_TOUCH = 104;
// 复选框ID ..
IDC_UPDATECREATETIME = 1000;
IDC_UPDATELASTACCESSTIME = 1001;
IDC_UPDATEMODIFIEDTIME = 1002;
// 处理WM_INITDIALOG消息
function Touch_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
begin
// 设置按钮选中
CheckDlgButton(hWnd, IDC_UPDATECREATETIME, BST_UNCHECKED);
CheckDlgButton(hWnd, IDC_UPDATELASTACCESSTIME, BST_UNCHECKED);
CheckDlgButton(hWnd, IDC_UPDATEMODIFIEDTIME, BST_CHECKED);
// 设置窗体图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, LoadIcon(HInstance, MakeIntResource(IDI_TOUCH)));
// 接收文件拖放
DragAcceptFiles(hWnd, TRUE);
// 接受默认焦点
Result := TRUE;
end;
// 处理WM_DROPFILES消息
procedure Touch_OnDropFiles(hWnd: HWND; hdrop: HDROP);
// 模拟c语言中的条件运算
function IfThen(AValue: UINT; ATrue: PFileTime; AFalse: PFileTime = nil): PFileTime;
begin
if (AValue = BST_CHECKED) then Result := ATrue else Result := AFalse;
end;
var
hfile: THandle;
st: TSystemTime;
ft: TFileTime;
nNumFiles: Integer;
szFilename: array[0..MAX_PATH] of Char;
fAnyBadFiles: BOOL;
szBadFiles: array[0..10240] of Char;
begin
// 查询数量
nNumFiles := DragQueryFile(hdrop, $FFFFFFFF, nil, 0);
// 出错记录
szBadFiles := 'The following file(s) could not be opened:'#13#10;
fAnyBadFiles := FALSE;
// 当前时间
GetSystemTime(st);
SystemTimeToFileTime(st, ft);
while (nNumFiles > 0) do
begin
Dec(nNumFiles);
// 单个文件
DragQueryFile(hdrop, nNumFiles, szFilename, SizeOf(szFilename));
// 打开文件
// 注: 在NT, 用FILE_FLAG_BACKUP_SEMANTICS标识可以打开目录
hfile := CreateFile(szFilename, GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN or FILE_FLAG_BACKUP_SEMANTICS, 0);
// 打开成功
if (hfile <> INVALID_HANDLE_VALUE) then
begin
// 修改时间
SetFileTime(hfile,
IfThen(IsDlgButtonChecked(hWnd, IDC_UPDATECREATETIME), @ft),
IfThen(IsDlgButtonChecked(hWnd, IDC_UPDATELASTACCESSTIME), @ft),
IfThen(IsDlgButtonChecked(hWnd, IDC_UPDATEMODIFIEDTIME), @ft) );
CloseHandle(hfile);
end else
begin
// 不是目录
if (GetFileAttributes(szFilename) and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
// 记录错误
lstrcat(szBadFiles, szFilename);
lstrcat(szBadFiles, #13#10);
fAnyBadFiles := TRUE;
end;
end;
end;
// 曾经出错
if (fAnyBadFiles) then MessageBox(hWnd, szBadFiles, 'Touch', 0);
// 释放内存
DragFinish(hdrop);
end;
// 处理WM_COMMAND消息
procedure Touch_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
begin
if (id = IDCANCEL) then EndDialog(hwnd, id);
end;
// 对话框消息处理回调
function Touch_DlgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
case (uMsg) of
WM_INITDIALOG:
begin
Result := BOOL(SetWindowLong(hWnd, DWL_MSGRESULT,
Longint(Touch_OnInitDialog(hWnd, wParam, lParam))));
end;
WM_COMMAND:
begin
Touch_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
Result := TRUE;
end;
WM_DROPFILES:
begin
Touch_OnDropFiles(hWnd, wParam);
Result := TRUE;
end;
else Result := FALSE; // 未曾处理
end;
end;
// 程序'主线程'入口
begin
DialogBox(HInstance, MakeIntResource(IDD_TOUCH), 0, @Touch_DlgProc);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -