一种利用Windows未公开函数实现机器上所做的各种操作

2019-10-08 09:56:00王旭

  SHCNE_DRIVEREMOVED: sEvent := '移去驱动器 '+strPath1;
  SHCNE_DRIVEADD: sEvent := '添加驱动器 '+strPath1;
  SHCNE_NETSHARE: sEvent := '改变目录 '+strPath1+ '的共享属性 ';
  SHCNE_ATTRIBUTES: sEvent := '改变文件目录属性 文件名 '+strPath1;
  SHCNE_UpdateDIR: sEvent := '更新目录 '+strPath1;
  SHCNE_UpdateITEM: sEvent := '更新文件 文件名: '+strPath1;
  SHCNE_SERVERDISCONNECT: sEvent := '断开与服务器的连接 '+strPath1+ ' '+strpath2;
  SHCNE_UpdateIMAGE: sEvent := 'SHCNE_UpdateIMAGE ';
  SHCNE_DRIVEADDGUI: sEvent := 'SHCNE_DRIVEADDGUI ';
  SHCNE_RENAMEFOLDER: sEvent := '重命名文件夹 '+strPath1+ '为 '+strpath2;
  SHCNE_FREESPACE: sEvent := '磁盘空间大小改变 ';
  SHCNE_ASSOCCHANGED: sEvent := '改变文件关联 ';
  else
  sEvent:= '未知操作 '+IntToStr(lParam);
  end;
  Result:=sEvent;
  end;
  function SHNotify_Register(hWnd : Integer) : Bool;
  var
  ps:PIDLSTRUCT;
  begin
  {$R-}
  Result:=False;
  If m_hSHNotify = 0 then begin
  //获取桌面文件夹的Pidl
  if SHGetSpecialFolderLocation(0, CSIDL_DESKTOP,
  m_pidlDesktop) <> NOERROR then
  Form1.close;
  if Boolean(m_pidlDesktop) then begin
  ps.bWatchSubFolders := 1;
  ps.pidl := m_pidlDesktop;
  // 利用SHChangeNotifyRegister函数注册系统消息处理
  m_hSHNotify := SHChangeNotifyRegister(hWnd, (SHCNF_TYPE or SHCNF_IDLIST),
  (SHCNE_ALLEVENTS or SHCNE_INTERRUPT),
  WM_SHNOTIFY, 1, ps);
  Result := Boolean(m_hSHNotify);
  end
  Else
  // 如果出现错误就使用 CoTaskMemFree函数来释放句柄
  CoTaskMemFree(m_pidlDesktop);
  End;
  {$R+}
  end;
  function SHNotify_UnRegister:Bool;
  begin
  Result:=False;
  If Boolean(m_hSHNotify) Then
  //取消系统消息监视,同时释放桌面的Pidl
  If Boolean(SHChangeNotifyDeregister(m_hSHNotify)) Then begin
  {$R-}
  m_hSHNotify := 0;
  CoTaskMemFree(m_pidlDesktop);
  Result := True;
  {$R-}
  End;
  end;
  procedure TForm1.WMShellReg(var Message:TMessage); //系统消息处理函数
  var
  strPath1,strPath2:String;
charPath:array[0..259]of char;
  pidlItem:PSHNOTIFYSTRUCT;
  begin
  pidlItem:=PSHNOTIFYSTRUCT(Message.wParam);
   //获得系统消息相关得路径
  SHGetPathFromIDList(pidlItem.dwItem1,charPath);
  strPath1:=charPath;
  SHGetPathFromIDList(pidlItem.dwItem2,charPath);
  strPath2:=charPath;
  Memo1.Lines.Add(SHEvEntName(strPath1,strPath2,Message.lParam)+chr(13)+chr(10));