⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touch.dpr

📁 这一系列是我平时收集的pascal深入核心编程
💻 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 + -