zoukankan      html  css  js  c++  java
  • delphi公用函数

    unit YzDelphiFunc;
    
    interface
    
    uses
      ComCtrls, Forms, Windows, Classes, SysUtils, ComObj, ActiveX, ShlObj, Messages,
      Graphics, Registry, Dialogs, Controls, uProcess, uCpuUsage, StrUtils, CommCtrl,
      jpeg, WinInet, ShellAPI, SHFolder, ADODB, WinSock;
    
    { 保存日志文件 }
    procedure YzWriteLogFile(Msg: String);
    
    { 延时函数,单位为毫秒 }
    procedure YzDelayTime(MSecs: Longint);
    
    { 判断字符串是否为数字 }
    function YzStrIsNum(Str: string):boolean;
    
    { 判断文件是否正在使用 }
    function YzIsFileInUse(fName: string): boolean;
    
    { 删除字符串列表中的空字符串 }
    procedure YzDelEmptyChar(AList: TStringList);
    
    { 删除文件列表中的"Thumbs.db"文件 }
    procedure YzDelThumbsFile(AList: TStrings);
    
    { 返回一个整数指定位数的带"0"字符串 }
    function YzIntToZeroStr(Value, ALength: Integer): string;
    
    { 取日期年份分量 }
    function YzGetYear(Date: TDate): Integer;
    
    { 取日期月份分量 }
    function YzGetMonth(Date: TDate): Integer;
    
    { 取日期天数分量 }
    function YzGetDay(Date: TDate): Integer;
    
    { 取时间小时分量 }
    function YzGetHour(Time: TTime): Integer;
    
    { 取时间分钟分量 }
    function YzGetMinute(Time: TTime): Integer;
    
    { 取时间秒钟分量 }
    function YzGetSecond(Time: TTime): Integer;
    
    { 返回时间分量字符串 }
    function YzGetTimeStr(ATime: TTime;AFlag: string): string;
    
    { 返回日期时间字符串 }
    function YzGetDateTimeStr(ATime: TTime;ADate: TDate): string;
    
    { 获取计算机名称 }
    function YzGetComputerName(): string;
    
    { 通过窗体子串查找窗体 }
    procedure YzFindSpecWindow(ASubTitle: string);
    
    { 判断进程CPU占用率 }
    procedure YzJudgeCPU(ProcessName: string;CPUUsage: Single);
    
    { 分割字符串 }
    procedure YzSeparateTerms(Source: string;Separator: Char;Terms: TStringList);
    
    { 切换页面控件的活动页面 }
    procedure YzGotoNewPage(AOwerPage: TPageControl;ANewPage: TTabSheet);
    
    { 设置页面控件标签的可见性 }
    procedure YzSetTableVisible(PageControl: TPageControl;ShowFlag: Boolean);
    
    { 根据产品名称获取产品编号 }
    function YzGetLevelCode(AName:string;ProductList: TStringList): string;
    
    { 取文件的主文件名 }
    function YzGetMainFileName(AFileName: string): string;
    
    { 按下一个键 }
    procedure YzPressOneKey(AByteCode: Byte);overload;
    
    { 按下一个指定次数的键 }
    procedure YzPressOneKey(AByteCode: Byte;ATimes: Integer);overload;
    
    { 按下二个键 }
    procedure YzPressTwoKeys(AFirstByteCode, ASecByteCode: Byte);
    
    { 按下三个键 }
    procedure YzPressThreeKeys(AFirstByteCode, ASecByteCode, AThirdByteCode: Byte);
    
    { 创建桌面快捷方式 }
    procedure YzCreateShortCut(const sPath: string; sShortCutName: WideString);
    
    { 删除桌面快捷方式 }
    procedure YzDeleteShortCut(sShortCutName: WideString);
    
    { 通过光标位置进行鼠标左键单击 }
    procedure YzMouseLeftClick(X, Y: Integer);overload;
    
    { 鼠标左键双击 }
    procedure YzMouseDoubleClick(X, Y: Integer);
    
    { 通过窗口句柄进行鼠标左键单击 }
    procedure YzMouseLeftClick(lpClassName, lpWindowName: PAnsiChar);overload;
    
    { 通过光标位置查找窗口句柄 }
    function YzWindowFromPoint(X, Y: Integer): THandle;
    
    { 等待窗口在指定时间后出现 }
    function YzWaitWindowExist(lpClassName, lpWindowName: PAnsiChar;
      ASecond: Integer = 0): THandle;overload;
    
    { 通光标位置,窗口类名与标题查找窗口是否存在 }
    function YzWaitWindowExist(X, Y: Integer;AClassName, AWinName: string;
      ASecond: Integer = 0):THandle; overload;
    
    { 等待指定窗口消失 }
    procedure YzWaitWindowClose(lpClassName, lpWindowName: PAnsiChar;
      ASecond: Integer = 0);
    
    { 通过窗口句柄设置文本框控件文本 }
    procedure YzSetEditText(lpClassName, lpWindowName: PAnsiChar;
      AText: string);overload;
    
    { 通过光标位置设置文本框控件文本 }
    procedure YzSetEditText(X, Y: Integer;AText: string);overload;
    
    { 获取Window操作系统语言 }
    function YzGetWindowsLanguageStr: String;
    
    { 清空动态数组 }
    procedure YzDynArraySetZero(var A);
    
    { 动态设置屏幕分辨率 }
    function YzDynamicResolution(X, Y: WORD): Boolean;
    
    { 检测系统屏幕分辨率 }
    function YzCheckDisplayInfo(X, Y: Integer): Boolean;
    
    type
      TFontedControl = class(TControl)
      public
        property Font;
      end;
      TFontMapping = record
        SWidth : Integer;
        SHeight: Integer;
        FName: string;
        FSize: Integer;
      end;
    
      procedure YzFixForm(AForm: TForm);
      procedure YzSetFontMapping;
    
    {---------------------------------------------------
     以下是关于获取系统软件卸载的信息的类型声明和函数
     ----------------------------------------------------}
    type
      TUninstallInfo = array of record
        RegProgramName: string;
        ProgramName   : string;
        UninstallPath : string;
        Publisher     : string;
        PublisherURL  : string;
        Version       : string;
        HelpLink      : string;
        UpdateInfoURL : string;
        RegCompany    : string;
        RegOwner      : string;
      end;
    
    { GetUninstallInfo 返回系统软件卸载的信息 }
    function YzGetUninstallInfo : TUninstallInfo;
    
    { 检测Java安装信息 }
    function YzCheckJavaInfo(AUninstallInfo: TUninstallInfo;CheckJava6 : Boolean = False): Boolean;
    
    { 窗口自适应屏幕大小 }
    procedure YzAdjustForm(Form: TForm;const OrgWidth, OrgHeight: integer);
    
    { 设置窗口为当前窗体 }
    procedure YzBringMyAppToFront(AppHandle: THandle);
    
    { 获取文件夹大小 }
    function YzGetDirSize(Dir: string;SubDir: Boolean): LongInt;
    
    { 获取文件夹文件数量 }
    function YzGetDirFiles(Dir: string;SubDir: Boolean): LongInt;
    
    { 获取文件大小(KB) }
    function YzGetFileSize(const FileName: String): LongInt;
    
    { 获取文件大小(字节) }
    function YzGetFileSize_Byte(const FileName: String): LongInt;
    
    { 算术舍入法的四舍五入取整函数 }
    function YzRoundEx (const Value: Real): LongInt;
    
    { 弹出选择目录对话框 }
    function YzSelectDir(const iMode: integer;const sInfo: string): string;
    
    { 获取指定路径下文件夹的个数 }
    procedure YzListFolders(const Path: String; const ShowPath: Boolean;var List: TStrings);
    
    { 禁用窗器控件的所有子控件 }
    procedure YzSetSubCtlState(AOwer: TWinControl;AState: Boolean);
    
    { 模拟键盘按键操作(处理字节码) }
    procedure YzFKeyent(byteCard: byte); overload;
    
    { 模拟键盘按键操作(处理字符串 }
    procedure YzFKeyent(strCard: string); overload;
    
    { 锁定窗口位置 }
    procedure YzLockWindow(ClassName,WinName: PChar;poX,poY: Integer);
    
    {   注册一个DLL形式或OCX形式的OLE/COM控件
        参数strOleFileName为一个DLL或OCX文件名,
        参数OleAction表示注册操作类型,1表示注册,0表示卸载
        返回值True表示操作执行成功,False表示操作执行失败
    }
    function YzRegisterOleFile (strOleFileName: STRING;OleAction: Byte): BOOLEAN;
    
    function YzListViewColumnCount(mHandle: THandle): Integer;
    
    function YzGetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;
    
    { 删除目录树 }
    function YzDeleteDirectoryTree(Path: string): boolean;
    
    { Jpg格式转换为bmp格式 }
    function JpgToBmp(Jpg: TJpegImage): TBitmap;
    
    { 设置程序自启动函数 }
    function YzSetAutoRun(AFilePath: string;AFlag: Boolean): boolean;
    
    { 检测URL地址是否有效 }
    function YzCheckUrl(url: string): Boolean;
    
    { 获取程序可执行文件名 }
    function YzGetExeFName: string;
    
    { 目录浏览对话框函数 }
    function YzBrowseFolder(AOwer: TWinControl;ATitle: string):string;
    
    { 重启计算机 }
    function YzShutDownSystem(AFlag: Integer):BOOL;
    
    { 程序运行后删除自身 }
    procedure YzDeleteSelf;
    
    { 程序重启 }
    procedure YzAppRestart;
    
    { 压缩Access数据库 }
    function YzCompactAccessDB(const AFileName, APassWord: string): Boolean;
    
    { 标题:获取其他进程中TreeView的文本 }
    function YzTreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem;
    function YzTreeNodeGetLevel(mHandle: THandle; mTreeItem: HTreeItem): Integer;
    function YzGetTreeViewText(mHandle: THandle; mStrings: TStrings): Boolean;
    
    { 获取本地Application Data目录路径 }
    function YzLocalAppDataPath : string;
    
    { 获取Windows当前登录的用户名 }
    function YzGetWindwosUserName: String;
    
    {枚举托盘图标 }
    function YzEnumTrayNotifyWnd(AFindList: TStringList;ADestStr: string): BOOL;
    
    { 获取SQL Server用户数据库列表 }
    procedure YzGetSQLServerDBList(ADBHostIP, ALoginPwd: string;ADBList: TStringList);
    
    { 读取据库中所有的表 }
    procedure YzGetTableList(ConncetStr: string;ATableList: TStringList);
    
    { 将域名解释成IP地址 }
    function YzDomainToIP(HostName: string): string;
    
    { 等待进程结束 }
    procedure YzWaitProcessExit(AProcessName: string);
    
    { 移去系统托盘失效图标 }
    procedure YzRemoveDeadIcons();
    
    { 转移程序占用内存至虚拟内存 }
    procedure YzClearMemory;
    
    { 检测允许试用的天数是否已到期 }
    function YzCheckTrialDays(AllowDays: Integer): Boolean;
    
    { 指定长度的随机小写字符串函数 }
    function YzRandomStr(aLength: Longint): string;
    
    var
      FontMapping : array of TFontMapping;
    
    implementation
    
    uses
      uMain;
    
    { 保存日志文件 }
    procedure YzWriteLogFile(Msg: String);
    var
      FileStream: TFileStream;
      LogFile   : String;
    begin
      try
        { 每天一个日志文件 }
        Msg := '[' + DateTimeToStr(Now)+ '] '+ Msg;
        LogFile := ExtractFilePath(Application.ExeName) + '/Logs/' + DateToStr(Now) + '.log';
        if not DirectoryExists(ExtractFilePath(LogFile)) then
          CreateDir(ExtractFilePath(LogFile));
        if FileExists(LogFile) then
          FileStream := TFileStream.Create(LogFile, fmOpenWrite or fmShareDenyNone)
        else
          FileStream:=TFileStream.Create(LogFile,fmCreate or fmShareDenyNone);
        FileStream.Position:=FileStream.Size;
        Msg := Msg + #13#10;
        FileStream.Write(PChar(Msg)^, Length(Msg));
        FileStream.Free;
      except
      end;
    end;
    
    { 延时函数,单位为毫秒 }
    procedure YZDelayTime(MSecs: Longint);
    var
      FirstTickCount, Now: Longint;
    begin
      FirstTickCount := GetTickCount();
      repeat
        Application.ProcessMessages;
        Now := GetTickCount();
      until (Now - FirstTickCount>=MSecs) or (Now < FirstTickCount);
    end;
    
    { 判断字符串是否为数字 }
    function YzStrIsNum(Str: string):boolean;
    var
      I: integer;
    begin
      if Str = '' then
      begin
        Result := False;
        Exit;
      end;
      for I:=1 to length(str) do
        if not (Str[I] in ['0'..'9']) then
        begin
          Result := False;
          Exit;
        end;
      Result := True;
    end;
    
    { 判断文件是否正在使用 }
    function YzIsFileInUse(fName: string): boolean;
    var
      HFileRes: HFILE;
    begin
      Result := false;
      if not FileExists(fName) then exit;
      HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      Result := (HFileRes = INVALID_HANDLE_VALUE);
      if not Result then CloseHandle(HFileRes);
    end;
    
    { 删除字符串列表中的空字符串 }
    procedure YzDelEmptyChar(AList: TStringList);
    var
      I: Integer;
      TmpList: TStringList;
    begin
      TmpList := TStringList.Create;
      for I := 0 to AList.Count - 1 do
        if AList.Strings[I] <> '' then TmpList.Add(AList.Strings[I]);
      AList.Clear;
      AList.Text := TmpList.Text;
      TmpList.Free;
    end;
    
    { 删除文件列表中的"Thumbs.db"文件 }
    procedure YzDelThumbsFile(AList: TStrings);
    var
      I: Integer;
      TmpList: TStringList;
    begin
      TmpList := TStringList.Create;
      for I := 0 to AList.Count - 1 do
        if ExtractFileName(AList.Strings[I]) <> 'Thumbs.db' then
          TmpList.Add(AList.Strings[I]);
      AList.Clear;
      AList.Text := TmpList.Text;
      TmpList.Free;
    end;
    
    {-------------------------------------------------------------
      功能:    返回一个整数指定位数的带"0"字符串
      参数:    Value:要转换的整数 ALength:字符串长度
      返回值:  string
    --------------------------------------------------------------}
    function YzIntToZeroStr(Value, ALength: Integer): string;
    var
      I, ACount: Integer;
    begin
      Result := '';
      ACount := Length(IntToStr(Value));
      if ACount >= ALength then Result := IntToStr(Value)
      else
      begin
        for I := 1 to ALength-ACount do
          Result := Result + '0';
        Result := Result + IntToStr(Value)
      end;
    end;
    
    { 取日期年份分量 }
    function YzGetYear(Date: TDate): Integer;
    var
      y, m, d: WORD;
    begin
      DecodeDate(Date, y, m, d);
      Result := y;
    end;
    
    { 取日期月份分量 }
    function YzGetMonth(Date: TDate): Integer;
    var
      y, m, d: WORD;
    begin
      DecodeDate(Date, y, m, d);
      Result := m;
    end;
    
    { 取日期天数分量 }
    function YzGetDay(Date: TDate): Integer;
    var
      y, m, d: WORD;
    begin
      DecodeDate(Date, y, m, d);
      Result := d;
    end;
    
    { 取时间小时分量 }
    function YzGetHour(Time: TTime): Integer;
    var
      h, m, s, ms: WORD;
    begin
      DecodeTime(Time, h, m, s, ms);
      Result := h;
    end;
    
    { 取时间分钟分量 }
    function YzGetMinute(Time: TTime): Integer;
    var
      h, m, s, ms: WORD;
    begin
      DecodeTime(Time, h, m, s, ms);
      Result := m;
    end;
    
    { 取时间秒钟分量 }
    function YzGetSecond(Time: TTime): Integer;
    var
      h, m, s, ms: WORD;
    begin
      DecodeTime(Time, h, m, s, ms);
      Result := s;
    end;
    
    { 返回时间分量字符串 }
    function YzGetTimeStr(ATime: TTime;AFlag: string): string;
    var
      wTimeStr: string;
      FH, FM, FS, FMS: WORD;
    const
      HOURTYPE    = 'Hour';
      MINUTETYPE  = 'Minute';
      SECONDTYPE  = 'Second';
      MSECONDTYPE = 'MSecond';
    begin
      wTimeStr := TimeToStr(ATime);
      if Pos('上午', wTimeStr) <> 0 then
        wTimeStr := Copy(wTimeStr, Pos('上午', wTimeStr) + 4, 10)
      else if Pos('下午', wTimeStr) <> 0 then
        wTimeStr := Copy(wTimeStr, Pos('下午', wTimeStr) + 4, 10);
      DecodeTime(ATime, FH, FM, FS, FMS);
      if AFlag = HOURTYPE then
      begin
        { 如果是12小时制则下午的小时分量加12 }
        if Pos('下午', wTimeStr) <> 0 then
          Result := YzIntToZeroStr(FH + 12, 2)
        else
          Result := YzIntToZeroStr(FH, 2);
      end;
      if AFlag = MINUTETYPE  then Result := YzIntToZeroStr(FM, 2);
      if AFlag = SECONDTYPE  then Result := YzIntToZeroStr(FS, 2);
      if AFlag = MSECONDTYPE then Result := YzIntToZeroStr(FMS, 2);
    end;
    
    { 返回日期时间字符串 }
    function YzGetDateTimeStr(ATime: TTime;ADate: TDate): string;
    var
      wYear, wMonth, wDay: string;
      wHour, wMinute, wSecond: string;
    begin
      wYear := RightStr(YzIntToZeroStr(YzGetYear(ADate), 4), 2);
      wMonth := YzIntToZeroStr(YzGetMonth(ADate), 2);
      wDay := YzIntToZeroStr(YzGetDay(ADate), 2);
    
      wHour := YzGetTimeStr(ATime, 'Hour');
      wMinute := YzGetTimeStr(ATime, 'Minute');
      wSecond := YzGetTimeStr(ATime, 'Second');
    
      Result := wYear + wMonth + wDay + wHour + wMinute + wSecond;
    end;
    
    { 通过窗体子串查找窗体 }
    procedure YzFindSpecWindow(ASubTitle: string);
    
      function EnumWndProc(AWnd: THandle;AWinName: string): Boolean;stdcall;
      var
        WindowText: array[0..255] of Char;
        WindowStr: string;
      begin
        GetWindowText(AWnd, WindowText, 255);
        WindowStr := StrPas(WindowText);
        WindowStr := COPY(WindowStr, 1, StrLen(PChar(AWinName)));
        if CompareText(AWinName, WindowStr) = 0 then
        begin
          SetForegroundWindow(AWnd);
          Result := False; Exit;
        end;
        Result := True;
      end;
    
    begin
      EnumWindows(@EnumWndProc, LongInt(@ASubTitle));
      YzDelayTime(1000);
    end;
    
    { 获取计算机名称 }
    function YzGetComputerName(): string;
    var
      pcComputer: PChar;
      dwCSize: DWORD;
    begin
      dwCSize := MAX_COMPUTERNAME_LENGTH + 1;
      Result := '';
      GetMem(pcComputer, dwCSize);
      try
        if Windows.GetComputerName(pcComputer, dwCSize) then
          Result := pcComputer;
      finally
        FreeMem(pcComputer);
      end;
    end;
    
    { 判断进程CPU占用率 }
    procedure YzJudgeCPU(ProcessName: string;CPUUsage: Single);
    var
      cnt: PCPUUsageData;
      usage: Single;
    begin
      cnt := wsCreateUsageCounter(FindProcess(ProcessName));
      while True do
      begin
        usage := wsGetCpuUsage(cnt);
        if usage <= CPUUsage then
        begin
          wsDestroyUsageCounter(cnt);
          YzDelayTime(2000);
          Break;
        end;
        YzDelayTime(10);
        Application.ProcessMessages;
      end;
    end;
    
    { 分割字符串 }
    procedure YzSeparateTerms(Source: string;Separator: Char;Terms: TStringList);
    var
      TmpStr: string;
      PO: integer;
    begin
      Terms.Clear;
      if Length(Source) = 0 then Exit;   { 长度为0则退出 }
      PO := Pos(Separator, Source);
      if PO = 0 then
      begin
        Terms.Add(Source);
        Exit;
      end;
      while PO <> 0 do
      begin
        TmpStr := Copy(Source, 1, PO - 1);{ 复制字符 }
        Terms.Add(TmpStr);                { 添加到列表 }
        Delete(Source, 1, PO);            { 删除字符和分割符 }
        PO := Pos(Separator, Source);     { 查找分割符 }
      end;
      if Length(Source) > 0 then
        Terms.Add(Source);                { 添加剩下的条目 }
    end;
    
    { 切换页面控件的活动页面 }
    procedure YzGotoNewPage(AOwerPage: TPageControl;ANewPage: TTabSheet);
    begin
      if AOwerPage.ActivePage <> ANewPage then AOwerPage.ActivePage := ANewPage;
    end;
    
    { 设置页面控件标签的可见性 }
    procedure YzSetTableVisible(PageControl: TPageControl;ShowFlag: Boolean);
    var
      I: Integer;
    begin
      for I := 0 to PageControl.PageCount -1 do
        PageControl.Pages[I].TabVisible := ShowFlag;
    end;
    
    { 根据产品名称获取产品编号 }
    function YZGetLevelCode(AName:string;ProductList: TStringList): string;
    var
      I: Integer;
      TmpStr: string;
    begin
      Result := '';
      if ProductList.Count <= 0 then Exit;
      for I := 0 to ProductList.Count-1 do
      begin
        TmpStr := ProductList.Strings[I];
        if AName = Copy(TmpStr,1, Pos('_', TmpStr)-1) then
        begin
          Result := Copy(TmpStr, Pos('_', TmpStr)+1, 10);
          Break;
        end;
      end;
    end;
    
    { 取文件的主文件名 }
    function YzGetMainFileName(AFileName:string): string;
    var
      TmpStr: string;
    begin
      if AFileName = '' then Exit;
      TmpStr := ExtractFileName(AFileName);
      Result := Copy(TmpStr, 1, Pos('.', TmpStr) - 1);
    end;
    
    { 按下一个键 }
    procedure YzPressOneKey(AByteCode: Byte);
    begin
      keybd_event(AByteCode, 0, 0, 0);
      YzDelayTime(100);
      keybd_event(AByteCode, 0, KEYEVENTF_KEYUP, 0);
      YzDelayTime(400);
    end;
    
    { 按下一个指定次数的键 }
    procedure YzPressOneKey(AByteCode: Byte;ATimes: Integer);overload;
    var
      I: Integer;
    begin
      for I := 1 to ATimes do
      begin
        keybd_event(AByteCode, 0, 0, 0);
        YzDelayTime(10);
        keybd_event(AByteCode, 0, KEYEVENTF_KEYUP, 0);
        YzDelayTime(150);
      end;
    end;
    
    { 按下二个键 }
    procedure YzPressTwoKeys(AFirstByteCode, ASecByteCode: Byte);
    begin
      keybd_event(AFirstByteCode, 0, 0, 0);
      keybd_event(ASecByteCode, 0, 0, 0);
      YzDelayTime(100);
      keybd_event(ASecByteCode, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(AFirstByteCode, 0, KEYEVENTF_KEYUP, 0);
      YzDelayTime(400);
    end;
    
    { 按下三个键 }
    procedure YzPressThreeKeys(AFirstByteCode, ASecByteCode, AThirdByteCode: Byte);
    begin
      keybd_event(AFirstByteCode, 0, 0, 0);
      keybd_event(ASecByteCode, 0, 0, 0);
      keybd_event(AThirdByteCode, 0, 0, 0);
      YzDelayTime(100);
      keybd_event(AThirdByteCode, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(ASecByteCode, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(AFirstByteCode, 0, KEYEVENTF_KEYUP, 0);
      YzDelayTime(400);
    end;
    
    { 创建桌面快捷方式 }
    procedure YzCreateShortCut(const sPath: string; sShortCutName: WideString);
    var
      tmpObject: IUnknown;
      tmpSLink: IShellLink;
      tmpPFile: IPersistFile;
      PIDL: PItemIDList;
      StartupDirectory: array[0..MAX_PATH] of Char;
      StartupFilename: String;
      LinkFilename: WideString;
    begin
      StartupFilename := sPath;
      tmpObject := CreateComObject(CLSID_ShellLink); { 创建建立快捷方式的外壳扩展 }
      tmpSLink := tmpObject as IShellLink;           { 取得接口 }
      tmpPFile := tmpObject as IPersistFile;         { 用来储存*.lnk文件的接口 }
      tmpSLink.SetPath(pChar(StartupFilename));      { 设定notepad.exe所在路径 }
      tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename))); {设定工作目录 }
      SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL); { 获得桌面的Itemidlist }
      SHGetPathFromIDList(PIDL, StartupDirectory);   { 获得桌面路径 }
      sShortCutName := '/' + sShortCutName + '.lnk';
      LinkFilename := StartupDirectory + sShortCutName;
      tmpPFile.Save(pWChar(LinkFilename), FALSE);    { 保存*.lnk文件 }
    end;
    
    { 删除桌面快捷方式 }
    procedure YzDeleteShortCut(sShortCutName: WideString);
    var
      PIDL : PItemIDList;
      StartupDirectory: array[0..MAX_PATH] of Char;
      LinkFilename: WideString;
    begin
      SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL);
      SHGetPathFromIDList(PIDL,StartupDirectory);
      LinkFilename := StrPas(StartupDirectory) + '/' + sShortCutName + '.lnk';
      DeleteFile(LinkFilename);
    end;
    
    { 通过光标位置进行鼠标左键单击 }
    procedure YzMouseLeftClick(X, Y: Integer);
    begin
      SetCursorPos(X, Y);
      YzDelayTime(100);
      mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      YzDelayTime(400);
    end;
    
    { 鼠标左键双击 }
    procedure YzMouseDoubleClick(X, Y: Integer);
    begin
      SetCursorPos(X, Y);
      YzDelayTime(100);
      mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      YzDelayTime(100);
      mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      YzDelayTime(400);
    end;
    
    
    { 通过窗口句柄进行鼠标左键单击 }
    procedure YzMouseLeftClick(lpClassName, lpWindowName: PAnsiChar);overload;
    var
      AHandel: THandle;
    begin
      AHandel := FindWindow(lpClassName, lpWindowName);
      SendMessage(AHandel, WM_LBUTTONDOWN, 0, 0);
      SendMessage(AHandel, WM_LBUTTONUP, 0, 0);
      YzDelayTime(500);
    end;
    
    { 等待进程结束 }
    procedure YzWaitProcessExit(AProcessName: string);
    begin
      while True do
      begin
        KillByPID(FindProcess(AProcessName));
        if FindProcess(AProcessName) = 0 then Break;
        YzDelayTime(10);
        Application.ProcessMessages;
      end;
    end;
    
    {-------------------------------------------------------------
      功  能:  等待窗口在指定时间后出现
      参  数:  lpClassName: 窗口类名
               lpWindowName: 窗口标题
               ASecond: 要等待的时间,"0"代表永久等待
      返回值:  无
      备  注:  如果指定的等待时间未到窗口已出现则立即退出
    --------------------------------------------------------------}
    function YzWaitWindowExist(lpClassName, lpWindowName: PAnsiChar;
      ASecond: Integer = 0): THandle;overload;
    var
      StartTickCount, PassTickCount: LongWord;
    begin
      Result := 0;
      { 永久等待 }
      if ASecond = 0 then
      begin
        while True do
        begin
          Result := FindWindow(lpClassName, lpWindowName);
          if Result <> 0 then Break;
          YzDelayTime(10);
          Application.ProcessMessages;
        end;
      end
      else { 等待指定时间 }
      begin
        StartTickCount := GetTickCount;
        while True do
        begin
          Result := FindWindow(lpClassName, lpWindowName);
          { 窗口已出现则立即退出 }
          if Result <> 0 then Break
          else
          begin
            PassTickCount := GetTickCount;
            { 等待时间已到则退出 }
            if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;
          end;
          YzDelayTime(10);
          Application.ProcessMessages;
        end;
      end;
      YzDelayTime(1000);
    end;
    
    { 等待指定窗口消失 }
    procedure YzWaitWindowClose(lpClassName, lpWindowName: PAnsiChar;
      ASecond: Integer = 0);
    var
      StartTickCount, PassTickCount: LongWord;
    begin
      if ASecond = 0 then
      begin
        while True do
        begin
          if FindWindow(lpClassName, lpWindowName) = 0 then Break;
          YzDelayTime(10);
          Application.ProcessMessages;
        end
      end
      else
      begin
        StartTickCount := GetTickCount;
        while True do
        begin
          { 窗口已关闭则立即退出 }
          if FindWindow(lpClassName, lpWindowName)= 0 then Break
          else
          begin
            PassTickCount := GetTickCount;
            { 等待时间已到则退出 }
            if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;
          end;
          YzDelayTime(10);
          Application.ProcessMessages;
        end;
      end;
      YzDelayTime(500);
    end;
    
    { 通过光标位置查找窗口句柄 }
    function YzWindowFromPoint(X, Y: Integer): THandle;
    var
      MousePoint: TPoint;
      CurWindow: THandle;
      hRect: TRect;
      Canvas: TCanvas;
    begin
      MousePoint.X := X;
      MousePoint.Y := Y;
      CurWindow := WindowFromPoint(MousePoint);
      GetWindowRect(Curwindow, hRect);
      if Curwindow <> 0 then
      begin
        Canvas := TCanvas.Create;
        Canvas.Handle := GetWindowDC(Curwindow);
        Canvas.Pen.Width := 2;
        Canvas.Pen.Color := clRed;
        Canvas.Pen.Mode := pmNotXor;
        Canvas.Brush.Style := bsClear;
        Canvas.Rectangle(0, 0, hRect.Right-hRect.Left, hRect.Bottom-hRect.Top);
        Canvas.Free;
      end;
      Result := CurWindow;
    end;
    
    { 通光标位置,窗口类名与标题查找窗口是否存在 }
    function YzWaitWindowExist(X, Y: Integer;AClassName, AWinName: string;
      ASecond: Integer):THandle;overload;
    var
      MousePo: TPoint;
      CurWindow: THandle;
      bufClassName: array[0..MAXBYTE-1] of Char;
      bufWinName: array[0..MAXBYTE-1] of Char;
      StartTickCount, PassTickCount: LongWord;
    begin
      Result := 0;
      { 永久等待 }
      if ASecond = 0 then
      begin
        while True do
        begin
          MousePo.X := X;
          MousePo.Y := Y;
          CurWindow := WindowFromPoint(MousePo);
          GetClassName(CurWindow, bufClassName, MAXBYTE);
          GetWindowText(CurWindow, bufWinname, MAXBYTE);
          if (CompareText(StrPas(bufClassName), AClassName) = 0 ) and
             (CompareText(StrPas(bufWinName), AWinName) = 0) then
          begin
            Result := CurWindow;
            Break;
          end;
          YzDelayTime(10);
          Application.ProcessMessages;
        end;
      end
      else { 等待指定时间 }
      begin
        StartTickCount := GetTickCount;
        while True do
        begin
          { 窗口已出现则立即退出 }
          MousePo.X := X;
          MousePo.Y := Y;
          CurWindow := WindowFromPoint(MousePo);
          GetClassName(CurWindow, bufClassName, MAXBYTE);
          GetWindowText(CurWindow, bufWinname, MAXBYTE);
          if (CompareText(StrPas(bufClassName), AClassName) = 0 ) and
             (CompareText(StrPas(bufWinName), AWinName) = 0) then
          begin
            Result := CurWindow; Break;
          end
          else
          begin
            PassTickCount := GetTickCount;
            { 等待时间已到则退出 }
            if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;
          end;
          YzDelayTime(10);
          Application.ProcessMessages;
        end;
      end;
      YzDelayTime(1000);
    end;
    
    { 通过窗口句柄设置文本框控件文本 }
    procedure YzSetEditText(lpClassName, lpWindowName: PAnsiChar;
      AText: string);overload;
    var
      CurWindow: THandle;
    begin
      CurWindow := FindWindow(lpClassName, lpWindowName);
      SendMessage(CurWindow ,WM_SETTEXT, 0, Integer(PChar(AText)));
      YzDelayTime(500);
    end;
    
    { 通过光标位置设置文本框控件文本 }
    procedure YzSetEditText(X, Y: Integer;AText: string);overload;
    var
      CurWindow: THandle;
    begin
      CurWindow := YzWindowFromPoint(X, Y);
      SendMessage(CurWindow, WM_SETTEXT, 0, Integer(PChar(AText)));
      YzMouseLeftClick(X, Y);
    end;
    
    { 获取Window操作系统语言 }
    function YzGetWindowsLanguageStr: String;
    var
      WinLanguage: array [0..50] of char;
    begin
      VerLanguageName(GetSystemDefaultLangID, WinLanguage, 50);
      Result := StrPas(WinLanguage);
    end;
    
    procedure YzDynArraySetZero(var A);
    var
      P: PLongint;  { 4个字节 }
    begin
      P := PLongint(A); { 指向 A 的地址 }
      Dec(P);  { P地址偏移量是 sizeof(A),指向了数组长度 }
      P^ := 0; { 数组长度清空 }
      Dec(P);  { 指向数组引用计数 }
      P^ := 0; { 数组计数清空 }
    end;
    
    { 动态设置分辨率 }
    function YzDynamicResolution(x, y: WORD): Boolean;
    var
      lpDevMode: TDeviceMode;
    begin
      Result := EnumDisplaySettings(nil, 0, lpDevMode);
      if Result then
      begin
        lpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
        lpDevMode.dmPelsWidth := x;
        lpDevMode.dmPelsHeight := y;
        Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
      end;
    end;
    
    procedure YzSetFontMapping;
    begin
      SetLength(FontMapping, 3);
    
      { 800 x 600 }
      FontMapping[0].SWidth := 800;
      FontMapping[0].SHeight := 600;
      FontMapping[0].FName := '宋体';
      FontMapping[0].FSize := 7;
    
      { 1024 x 768 }
      FontMapping[1].SWidth := 1024;
      FontMapping[1].SHeight := 768;
      FontMapping[1].FName := '宋体';
      FontMapping[1].FSize := 9;
    
      { 1280 x 1024 }
      FontMapping[2].SWidth := 1280;
      FontMapping[2].SHeight := 1024;
      FontMapping[2].FName := '宋体';
      FontMapping[2].FSize := 11;
    end;
    
    { 程序窗体及控件自适应分辨率(有问题) }
    procedure YzFixForm(AForm: TForm);
    var
      I, J: integer;
      T: TControl;
    begin
      with AForm do
      begin
        for I := 0 to ComponentCount - 1 do
        begin
          try
            T := TControl(Components[I]);
            T.left := Trunc(T.left * (Screen.width / 1024));
            T.top := Trunc(T.Top * (Screen.Height / 768));
            T.Width := Trunc(T.Width * (Screen.Width / 1024));
            T.Height := Trunc(T.Height * (Screen.Height / 768));
          except
          end; { try }
        end; { for I }
    
        for I:= 0 to Length(FontMapping) - 1 do
        begin
          if (Screen.Width = FontMapping[I].SWidth) and (Screen.Height =
            FontMapping[I].SHeight) then
          begin
            for J := 0 to ComponentCount - 1 do
            begin
              try
                TFontedControl(Components[J]).Font.Name := FontMapping[I].FName;
                TFontedControl(Components[J]).FONT.Size := FontMapping[I].FSize;
              except
              end; { try }
            end; { for J }
          end; { if }
        end; { for I }
      end; { with }
    end;
    
    { 检测系统屏幕分辨率 }
    function YzCheckDisplayInfo(X, Y: Integer): Boolean;
    begin
      Result := True;
      if (Screen.Width <> X) and (Screen.Height <> Y) then
      begin
        if MessageBox(Application.Handle, PChar( '系统检测到您的屏幕分辨率不是 '
          + IntToStr(X) + '×' + IntToStr(Y) + ',这将影响到系统的正常运行,'
          + '是否要自动调整屏幕分辨率?'), '提示', MB_YESNO + MB_ICONQUESTION
          + MB_TOPMOST) = 6 then YzDynamicResolution(1024, 768)
        else Result := False;
      end;
    end;
    
    function YzGetUninstallInfo: TUninstallInfo;
    const
      Key = '/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/';
    var
      S : TStrings;
      I : Integer;
      J : Integer;
    begin
      with TRegistry.Create do
      begin
        S := TStringlist.Create;
        J := 0;
        try
          RootKey:= HKEY_LOCAL_MACHINE;
          OpenKeyReadOnly(Key);
          GetKeyNames(S);
          Setlength(Result, S.Count);
          for I:= 0 to S.Count - 1 do
          begin
            If OpenKeyReadOnly(Key + S[I]) then
            If ValueExists('DisplayName') and ValueExists('UninstallString') then
            begin
              Result[J].RegProgramName:= S[I];
              Result[J].ProgramName:= ReadString('DisplayName');
              Result[J].UninstallPath:= ReadString('UninstallString');
              If ValueExists('Publisher') then
                Result[J].Publisher:= ReadString('Publisher');
              If ValueExists('URLInfoAbout') then
                Result[J].PublisherURL:= ReadString('URLInfoAbout');
              If ValueExists('DisplayVersion') then
                Result[J].Version:= ReadString('DisplayVersion');
              If ValueExists('HelpLink') then
                Result[J].HelpLink:= ReadString('HelpLink');
              If ValueExists('URLUpdateInfo') then
                Result[J].UpdateInfoURL:= ReadString('URLUpdateInfo');
              If ValueExists('RegCompany') then
                Result[J].RegCompany:= ReadString('RegCompany');
              If ValueExists('RegOwner') then
                Result[J].RegOwner:= ReadString('RegOwner');
              Inc(J);
            end;
          end;
        finally
          Free;
          S.Free;
          SetLength(Result, J);
        end;
      end;
    end;
    
    { 检测Java安装信息 }
    function YzCheckJavaInfo(AUninstallInfo: TUninstallInfo;CheckJava6 : Boolean = False): Boolean;
    var
      I: Integer;
      Java6Exist: Boolean;
      AUninstall: TUninstallInfo;
      AProgramList: TStringList;
      AJavaVersion, AFilePath: string;
    begin
      Result := True;
      Java6Exist := False;
      AJavaVersion := 'J2SE Runtime Environment 5.0 Update 14';
      AUninstall := YzGetUninstallInfo;
      AProgramList := TStringList.Create;
      for I := Low(AUninstall) to High(AUninstall) do
      begin
        if Pos('J2SE', AUninstall[I].ProgramName) <> 0 then
          AProgramList.Add(AUninstall[I].ProgramName);
        if Pos('Java(TM)', AUninstall[I].ProgramName) <> 0 then
          Java6Exist := True;
      end;
      if Java6Exist then
      begin
        if CheckJava6 then
        begin
          MessageBox(Application.Handle, '系统检测到您机器上安装了Java6以上的版本,'
            + '如果影响到系统的正常运行请先将其卸载再重新启动系统!', '提示',
            MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
          Result := False;
        end;
      end
      else if AProgramList.Count = 0 then
      begin
        MessageBox(Application.Handle, '系统检测到您机器上没有安装Java运行环境,'
          + '请点击 "确定" 安装Java运行环境后再重新运行程序!',
          '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
    
        AFilePath := ExtractFilePath(ParamStr(0)) + 'java' + '/'
          + 'jre-1_5_0_14-windows-i586-p.exe';
        if FileExists(AFilePath) then  WinExec(PChar(AFilePath), SW_SHOWNORMAL)
        else
          MessageBox(Application.Handle, '找不到Java安装文件,请您手动安装!',
            '提示', MB_OK + MB_ICONINFORMATION  + MB_TOPMOST);
        Result := False;
      end;
      AProgramList.Free;
    end;
    
    {-------------------------------------------------------------
      功能:    窗口自适应屏幕大小
      参数:    Form: 需要调整的Form
               OrgWidth:开发时屏幕的宽度
               OrgHeight:开发时屏幕的高度
    --------------------------------------------------------------}
    procedure YzAdjustForm(Form: TForm;const OrgWidth, OrgHeight: integer);
    begin
      with Form do
      begin
        if (Screen.width <> OrgWidth) then
        begin
          Scaled := True;
          Height := longint(Height) * longint(Screen.height) div OrgHeight;
          Width := longint(Width) * longint(Screen.Width) div OrgWidth;
          ScaleBy(Screen.Width, OrgWidth);
        end;
      end;
    end;
    
    { 设置窗口为当前窗体 }
    procedure YzBringMyAppToFront(AppHandle: THandle);
    var
      Th1, Th2: Cardinal;
    begin
      Th1 := GetCurrentThreadId;
      Th2 := GetWindowThreadProcessId(GetForegroundWindow, NIL);
      AttachThreadInput(Th2, Th1, TRUE);
      try
        SetForegroundWindow(AppHandle);
      finally
        AttachThreadInput(Th2, Th1, TRUE);
      end;
    end;
    
    { 获取文件夹文件数量 }
    function YzGetDirFiles(Dir: string;SubDir: Boolean): LongInt;
    var
      SearchRec: TSearchRec;
      Founded: integer;
    begin
      Result := 0;
      if Dir[length(Dir)] <> '/' then Dir := Dir + '/';
      Founded := FindFirst(Dir + '*.*', faAnyFile, SearchRec);
      while Founded = 0 do
      begin
        Inc(Result);
        if (SearchRec.Attr and faDirectory > 0) and (SearchRec.Name[1] <> '.') and
          (SubDir = True) then
          Inc(Result, YzGetDirFiles(Dir + SearchRec.Name, True));
          Founded := FindNext(SearchRec);
      end;
      FindClose(SearchRec);
    end;
    
    { 算术舍入法的四舍五入取整函数 }
    function YzRoundEx (const Value: Real): LongInt;
    var
      x: Real;
    begin
      x := Value - Trunc(Value);
      if x >= 0.5 then
        Result := Trunc(Value) + 1
      else Result := Trunc(Value);
    end;
    
    { 获取文件大小(KB) }
    function YzGetFileSize(const FileName: String): LongInt;
    var
      SearchRec: TSearchRec;
    begin
      if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
        Result := SearchRec.Size
      else
        Result := -1;
      Result := YzRoundEx(Result / 1024);
    end;
    
    { 获取文件大小(字节) }
    function YzGetFileSize_Byte(const FileName: String): LongInt;
    var
      SearchRec: TSearchRec;
    begin
      if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
        Result := SearchRec.Size
      else
        Result := -1;
    end;
    
    { 获取文件夹大小 }
    function YzGetDirSize(Dir: string;SubDir: Boolean): LongInt;
    var
      SearchRec: TSearchRec;
      Founded: integer;
    begin
      Result := 0;
      if Dir[length(Dir)] <> '/' then Dir := Dir + '/';
      Founded := FindFirst(Dir + '*.*', faAnyFile, SearchRec);
      while Founded = 0 do
      begin
        Inc(Result, SearchRec.size);
        if (SearchRec.Attr and faDirectory > 0) and (SearchRec.Name[1] <> '.') and
          (SubDir = True) then
          Inc(Result, YzGetDirSize(Dir + SearchRec.Name, True));
          Founded := FindNext(SearchRec);
      end;
      FindClose(SearchRec);
      Result := YzRoundEx(Result / 1024);
    end;
    
    {-------------------------------------------------------------
      功能:    弹出选择目录对话框
      参数:    const iMode: 选择模式
               const sInfo: 对话框提示信息
      返回值:  如果取消取返回为空,否则返回选中的路径
    --------------------------------------------------------------}
    function YzSelectDir(const iMode: integer;const sInfo: string): string;
    var
      Info: TBrowseInfo;
      IDList: pItemIDList;
      Buffer: PChar;
    begin
      Result:='';
      Buffer := StrAlloc(MAX_PATH);
      with Info do
      begin
        hwndOwner := application.mainform.Handle;  { 目录对话框所属的窗口句柄 }
        pidlRoot := nil;                           { 起始位置,缺省为我的电脑 }
        pszDisplayName := Buffer;                  { 用于存放选择目录的指针 }
        lpszTitle := PChar(sInfo);
        { 此处表示显示目录和文件,如果只显示目录则将后一个去掉即可 }
        if iMode = 1 then
          ulFlags := BIF_RETURNONLYFSDIRS or BIF_BROWSEINCLUDEFILES
        else
          ulFlags := BIF_RETURNONLYFSDIRS;
        lpfn := nil;                               { 指定回调函数指针 }
        lParam := 0;                               { 传递给回调函数参数 }
        IDList := SHBrowseForFolder(Info);         { 读取目录信息 }
      end;
      if IDList <> nil then
      begin
        SHGetPathFromIDList(IDList, Buffer);     { 将目录信息转化为路径字符串 }
        Result := strpas(Buffer);
      end;
      StrDispose(buffer);
    end;
    
    { 获取指定路径下文件夹的个数 }
    procedure YzListFolders(const Path: String; const ShowPath: Boolean;var List: TStrings);
    var
      SRec: TSearchRec;
    begin
     if not Assigned(List) then List:= TStringList.Create;
     FindFirst(Path + '*.*', faDirectory, SRec);
     if ShowPath then
        List.Add(Path + SRec.Name)
     else
        List.Add(SRec.Name);
     while FindNext(SRec) = 0 do
        if ShowPath then
           List.Add(Path + SRec.Name)
        else
           List.Add(SRec.Name);
     FindClose(SRec);
    end;
    
    { 禁用窗器控件的所有子控件 }
    procedure YzSetSubCtlState(AOwer: TWinControl;AState: Boolean);
    var
      I: Integer;
    begin
      for I := 0 to AOwer.ControlCount - 1 do
       AOwer.Controls[I].Enabled := AState;
    end;
    
    { 模拟键盘按键操作(处理字节码) }
    procedure YzFKeyent(byteCard: byte);
    var
      vkkey: integer;
    begin
      vkkey := VkKeyScan(chr(byteCard));
      if (chr(byteCard) in ['A'..'Z']) then
      begin
        keybd_event(VK_SHIFT, 0, 0, 0);
        keybd_event(byte(byteCard), 0, 0, 0);
        keybd_event(VK_SHIFT, 0, 2, 0);
      end
      else if chr(byteCard) in ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
        '_', '+', '|', '{', '}', ':', '"', '<', '>', '?', '~'] then
      begin
        keybd_event(VK_SHIFT, 0, 0, 0);
        keybd_event(byte(vkkey), 0, 0, 0);
        keybd_event(VK_SHIFT, 0, 2, 0);
      end
      else { if byteCard in [8,13,27,32] }
      begin
        keybd_event(byte(vkkey), 0, 0, 0);
      end;
    end;
    
    { 模拟键盘按键(处理字符) }
    procedure YzFKeyent(strCard: string);
    var
      str: string;
      strLength: integer;
      I: integer;
      byteSend: byte;
    begin
      str := strCard;
      strLength := length(str);
      for I := 1 to strLength do
      begin
        byteSend := byte(str[I]);
        YzFKeyent(byteSend);
      end;
    end;
    
    { 锁定窗口位置 }
    procedure YzLockWindow(ClassName,WinName: PChar;poX,poY: Integer);
    var
      CurWindow: THandle;
      _wndRect: TRect;
    begin
      CurWindow := 0;
      while True do
      begin
        CurWindow := FindWindow(ClassName,WinName);
        if CurWindow <> 0 then Break;
        YzDelayTime(10);
        Application.ProcessMessages;
      end;
      GetWindowRect(CurWindow,_wndRect);
      if ( _wndRect.Left <> poX) or ( _wndRect.Top <> poY) then
      begin
           MoveWindow(CurWindow,
           poX,
           poY,
           (_wndRect.Right-_wndRect.Left),
           (_wndRect.Bottom-_wndRect.Top),
            TRUE);
      end;
      YzDelayTime(1000);
    end;
    
    {
      注册一个DLL形式或OCX形式的OLE/COM控件
      参数strOleFileName为一个DLL或OCX文件名,
      参数OleAction表示注册操作类型,1表示注册,0表示卸载
      返回值True表示操作执行成功,False表示操作执行失败
    }
    function YzRegisterOleFile (strOleFileName: STRING;OleAction: Byte): BOOLEAN;
    const
      RegisterOle   =   1; { 注册 }
      UnRegisterOle =   0; { 卸载 }
    type
      TOleRegisterFunction = function: HResult; { 注册或卸载函数的原型 }
    var
      hLibraryHandle: THandle;    { 由LoadLibrary返回的DLL或OCX句柄 }
      hFunctionAddress: TFarProc; { DLL或OCX中的函数句柄,由GetProcAddress返回 }
      RegFunction: TOleRegisterFunction; { 注册或卸载函数指针 }
    begin
      Result := FALSE;
      { 打开OLE/DCOM文件,返回的DLL或OCX句柄 }
      hLibraryHandle := LoadLibrary(PCHAR(strOleFileName));
      if (hLibraryHandle > 0) then        { DLL或OCX句柄正确 }
      try
        { 返回注册或卸载函数的指针 }
        if (OleAction = RegisterOle) then { 返回注册函数的指针 }
          hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllRegisterServer'))
        { 返回卸载函数的指针 }
        else
          hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllUnregisterServer'));
        if (hFunctionAddress <> NIL) then { 注册或卸载函数存在 }
        begin
          { 获取操作函数的指针 }
          RegFunction := TOleRegisterFunction(hFunctionAddress);
          { 执行注册或卸载操作,返回值>=0表示执行成功 }
          if RegFunction >= 0 then
            Result   :=   true;
        end;
      finally
        { 关闭已打开的OLE/DCOM文件 }
        FreeLibrary(hLibraryHandle);
      end;
    end;
    
    function YzListViewColumnCount(mHandle: THandle): Integer;
    begin
      Result := Header_GetItemCount(ListView_GetHeader(mHandle));
    end; { ListViewColumnCount }
    
    function YzGetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;
    var
      vColumnCount: Integer;
      vItemCount: Integer;
      I, J: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      S: string;  vItem: TLVItem;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      vColumnCount := YzListViewColumnCount(mHandle);
      if vColumnCount <= 0 then Exit;
      vItemCount := ListView_GetItemCount(mHandle);
      GetWindowThreadProcessId(mHandle, @vProcessId);
      vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ
        or  PROCESS_VM_WRITE, False, vProcessId);
      vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
        PAGE_READWRITE);
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        for I := 0 to vItemCount - 1 do
        begin
          S := '';
          for J := 0 to vColumnCount - 1 do
          begin
            with vItem do
            begin
              mask := LVIF_TEXT;
              iItem := I;
              iSubItem := J;
              cchTextMax := SizeOf(vBuffer);
              pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
            end;
            WriteProcessMemory(vProcess, vPointer, @vItem,
            SizeOf(TLVItem), vNumberOfBytesRead);
            SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));
            ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
              @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
            S := S + #9 + vBuffer;
          end;
          Delete(S, 1, 1);
          mStrings.Add(S);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);    mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetListViewText }
    
    { 删除目录树 }
    function YzDeleteDirectoryTree(Path: string): boolean;
    var
      SearchRec: TSearchRec;
      SFI: string;
    begin
      Result := False;
      if (Path = '') or (not DirectoryExists(Path)) then exit;
      if Path[length(Path)] <> '/' then Path := Path + '/';
      SFI := Path + '*.*';
      if FindFirst(SFI, faAnyFile, SearchRec) = 0 then
      begin
        repeat
          begin
            if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
              Continue;
            if (SearchRec.Attr and faDirectory <> 0) then
            begin
              if not YzDeleteDirectoryTree(Path + SearchRec.name) then
                Result := FALSE;
            end
            else
            begin
              FileSetAttr(Path + SearchRec.Name, 128);
              DeleteFile(Path + SearchRec.Name);
            end;
          end
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
      FileSetAttr(Path, 0);
      if RemoveDir(Path) then
        Result := TRUE
      else
        Result := FALSE;
    end;
    
    { Jpg格式转换为bmp格式 }
    function JpgToBmp(Jpg: TJpegImage): TBitmap;
    begin
      Result := nil;
      if Assigned(Jpg) then
      begin
        Result := TBitmap.Create;
        Jpg.DIBNeeded;
        Result.Assign(Jpg);
      end;
    end;
    
    { 设置程序自启动函数 }
    function YzSetAutoRun(AFilePath: string;AFlag: Boolean): boolean;
    var
      AMainFName: string;
      Reg: TRegistry;
    begin
      Result := true;
      AMainFName := YzGetMainFileName(AFilePath);
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        Reg.OpenKey('SOFTWARE/Microsoft/Windows/CurrentVersion/Run', True);
        if AFlag = False then  { 取消自启动 }
          Reg.DeleteValue(AMainFName)
        else                   { 设置自启动 }
          Reg.WriteString(AMainFName, '"' + AFilePath + '"')
      except
        Result := False;
      end;
      Reg.CloseKey;
      Reg.Free;
    end;
    
    { 检测URL地址是否有效 }
    function YzCheckUrl(url: string): Boolean;
    var
      hSession, hfile, hRequest: HINTERNET;
      dwindex, dwcodelen: dword;
      dwcode: array[1..20] of Char;
      res: PChar;
    begin
      Result := False;
      try
        if Pos('http://',LowerCase(url)) = 0 then url := 'http://' + url;
        { Open an internet session }
        hSession:=InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil, 0);
        if Assigned(hsession) then
        begin
          hfile := InternetOpenUrl(hsession, PChar(url), nil, 0,INTERNET_FLAG_RELOAD, 0);
          dwIndex := 0;
          dwCodeLen := 10;
          HttpQueryInfo(hfile,HTTP_QUERY_STATUS_CODE,@dwcode,dwcodeLen,dwIndex);
          res := PChar(@dwcode);
          Result := (res = '200') or (res = '302');
          if Assigned(hfile) then InternetCloseHandle(hfile);
          InternetCloseHandle(hsession);
        end;
      except
      end;
    end;
    
    { 获取程序可执行文件名 }
    function YzGetExeFName: string;
    begin
      Result := ExtractFileName(Application.ExeName);
    end;
    
    { 目录浏览对话框函数 }
    function YzBrowseFolder(AOwer: TWinControl;ATitle: string):string;
    var
      Info: TBrowseInfo;
      Dir: array[0..260] of char;
      ItemId: PItemIDList;
    begin
      with Info do
      begin
        hwndOwner := AOwer.Handle;
        pidlRoot := nil;
        pszDisplayName := nil;
        lpszTitle := PChar(ATitle);
        ulFlags := 0;
        lpfn := nil;
        lParam := 0;
        iImage := 0;
      end;
      ItemId := SHBrowseForFolder(Info);
      SHGetPathFromIDList(ItemId,@Dir);
      Result := string(Dir);
    end;
    
    { 重启计算机 }
    function YzShutDownSystem(AFlag: Integer):BOOL;
    var
      hProcess,hAccessToken: THandle;
      LUID_AND_ATTRIBUTES: TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;
      BufferIsNull: DWORD;
    Const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';
    begin
      hProcess:=GetCurrentProcess();
    
      OpenProcessToken(hprocess, TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, hAccessToken);
      LookupPrivilegeValue(Nil, SE_SHUTDOWN_NAME, LUID_AND_ATTRIBUTES.Luid);
      LUID_AND_ATTRIBUTES.Attributes := SE_PRIVILEGE_ENABLED;
      TOKEN_PRIVILEGES.PrivilegeCount := 1;
      TOKEN_PRIVILEGES.Privileges[0] := LUID_AND_ATTRIBUTES;
      BufferIsNull := 0;
    
      AdjustTokenPrivileges(hAccessToken, False, TOKEN_PRIVILEGES, sizeof(
        TOKEN_PRIVILEGES) ,Nil, BufferIsNull);
      Result := ExitWindowsEx(AFlag, 0);
    end;
    
    { 程序运行后删除自身 }
    procedure YzDeleteSelf;
    var
      hModule: THandle;
      buff:    array[0..255] of Char;
      hKernel32: THandle;
      pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer;
    begin
      hModule := GetModuleHandle(nil);
      GetModuleFileName(hModule, buff, sizeof(buff));
    
      CloseHandle(THandle(4));
    
      hKernel32        := GetModuleHandle('KERNEL32');
      pExitProcess     := GetProcAddress(hKernel32, 'ExitProcess');
      pDeleteFileA     := GetProcAddress(hKernel32, 'DeleteFileA');
      pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
    
      asm
        LEA         EAX, buff
        PUSH        0
        PUSH        0
        PUSH        EAX
        PUSH        pExitProcess
        PUSH        hModule
        PUSH        pDeleteFileA
        PUSH        pUnmapViewOfFile
        RET
      end;
    end;
    
    { 程序重启 }
    procedure YzAppRestart;
    var
      AppName : PChar;
    begin
      AppName := PChar(Application.ExeName) ;
      ShellExecute(Application.Handle,'open', AppName, nil, nil, SW_SHOWNORMAL);
      KillByPID(GetCurrentProcessId);
    end;
    
    { 压缩Access数据库 }
    function YzCompactAccessDB(const AFileName, APassWord: string): Boolean;
    var
      SPath, FConStr, TmpConStr: string;
      SFile: array[0..254] of Char;
      STempFileName: string;
      JE: OleVariant;
      function GetTempDir: string;
      var
        Buffer: array[0..MAX_PATH] of Char;
      begin
        ZeroMemory(@Buffer, MAX_PATH);
        GetTempPath(MAX_PATH, Buffer);
        Result := IncludeTrailingBackslash(StrPas(Buffer));
      end;
    begin
      Result := False;
      SPath := GetTempDir;  { 取得Windows的Temp路径 }
    
      { 取得Temp文件名,Windows将自动建立0字节文件 }
      GetTempFileName(PChar(SPath), '~ACP', 0, SFile);
      STempFileName := SFile;
    
      { 删除Windows建立的0字节文件 }
      if not DeleteFile(STempFileName) then Exit;
      try
        JE := CreateOleObject('JRO.JetEngine');
    
        { 压缩数据库 }
        FConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + AFileName
          + ';Jet OLEDB:DataBase PassWord=' + APassWord;
    
        TmpConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + STempFileName
          + ';Jet OLEDB:DataBase PassWord=' + APassWord;
        JE.CompactDatabase(FConStr, TmpConStr);
    
        { 覆盖源数据库文件 }
        Result := CopyFile(PChar(STempFileName), PChar(AFileName), False);
    
        { 删除临时文件 }
        DeleteFile(STempFileName);
      except
        Application.MessageBox('压缩数据库失败!', '提示', MB_OK +
          MB_ICONINFORMATION);
      end;
    end;
    
    { 标题:获取其他进程中TreeView的文本 }
    function YzTreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem;
    var
      vParentID: HTreeItem;
    begin
      Result := nil;
      if (mHandle <> 0) and (mTreeItem <> nil) then
      begin
        Result := TreeView_GetChild(mHandle, mTreeItem);
        if Result = nil then
          Result := TreeView_GetNextSibling(mHandle, mTreeItem);
        vParentID := mTreeItem;
        while (Result = nil) and (vParentID <> nil) do
        begin
          vParentID := TreeView_GetParent(mHandle, vParentID);
          Result := TreeView_GetNextSibling(mHandle, vParentID);
        end;
      end;
    end; { TreeNodeGetNext }
    
    function YzTreeNodeGetLevel(mHandle: THandle; mTreeItem: HTreeItem): Integer;
    var
      vParentID: HTreeItem;
    begin
      Result := -1;
      if (mHandle <> 0) and (mTreeItem <> nil) then
      begin
        vParentID := mTreeItem;
        repeat
          Inc(Result);
          vParentID := TreeView_GetParent(mHandle, vParentID);
        until vParentID = nil;
      end;
    end; { TreeNodeGetLevel }
    
    function YzGetTreeViewText(mHandle: THandle; mStrings: TStrings): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      GetWindowThreadProcessId(mHandle, @vProcessId);
      vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
        PROCESS_VM_WRITE, False, vProcessId);
      vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or
        MEM_COMMIT, PAGE_READWRITE);
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        vItemCount := TreeView_GetCount(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        for I := 0 to vItemCount - 1 do
        begin
          with vItem do begin
            mask := TVIF_TEXT; cchTextMax := SizeOf(vBuffer);
            pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem));
            hItem := vTreeItem;
          end;
          WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(vItem),
            vNumberOfBytesRead);
          SendMessage(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
          @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          mStrings.Add(StringOfChar(#9, YzTreeNodeGetLevel(mHandle, vTreeItem)) + vBuffer);
          vTreeItem := YzTreeNodeGetNext(mHandle, vTreeItem);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess); mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetTreeViewText }
    
    { 获取其他进程中ListBox和ComboBox的内容 }
    function YzGetListBoxText(mHandle: THandle; mStrings: TStrings): Boolean;
    var
      vItemCount: Integer;
      I: Integer;
      S: string;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        vItemCount := SendMessage(mHandle, LB_GETCOUNT, 0, 0);
        for I := 0 to vItemCount - 1 do
        begin
          SetLength(S, SendMessage(mHandle, LB_GETTEXTLEN, I, 0));
          SendMessage(mHandle, LB_GETTEXT, I, Integer(@S[1]));
          mStrings.Add(S);
        end;
        SetLength(S, 0);
      finally
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetListBoxText }
    
    function YzGetComboBoxText(mHandle: THandle; mStrings: TStrings): Boolean;
    var
      vItemCount: Integer;
      I: Integer;
      S: string;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        vItemCount := SendMessage(mHandle, CB_GETCOUNT, 0, 0);
        for I := 0 to vItemCount - 1 do
        begin
          SetLength(S, SendMessage(mHandle, CB_GETLBTEXTLEN, I, 0));
          SendMessage(mHandle, CB_GETLBTEXT, I, Integer(@S[1]));
          mStrings.Add(S);
        end;
        SetLength(S, 0);
      finally
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetComboBoxText }
    
    { 获取本地Application Data目录路径 }
    function YzLocalAppDataPath : string;
    const
       SHGFP_TYPE_CURRENT = 0;
    var
       Path: array [0..MAX_PATH] of char;
    begin
       SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]) ;
       Result := Path;
    end;
    
    { 获取Windows当前登录的用户名 }
    function YzGetWindwosUserName: String;
    var
      pcUser: PChar;
      dwUSize: DWORD;
    begin
      dwUSize := 21;
      result  := '';
      GetMem(pcUser, dwUSize);
      try
        if Windows.GetUserName(pcUser, dwUSize) then
          Result := pcUser
      finally
        FreeMem(pcUser);
      end;
    end;
    
    {-------------------------------------------------------------
      功  能:  delphi 枚举托盘图标
      参  数:  AFindList: 返回找到的托盘列表信息
      返回值:  成功为True,反之为False
      备  注:  返回的格式为: 位置_名称_窗口句柄_进程ID
    --------------------------------------------------------------}
    function YzEnumTrayNotifyWnd(AFindList: TStringList;ADestStr: string): BOOL;
    var
      wd: HWND;
      wtd: HWND;
      wd1: HWND;
      pid: DWORD;
      hd: THandle;
      num, i: integer;
      n: ULONG;
      p: TTBBUTTON;
      pp: ^TTBBUTTON;
      x: string;
      name: array[0..255] of WCHAR;
      whd, proid: ulong;
      temp: string;
      sp: ^TTBBUTTON;
      _sp: TTBButton;
    begin
      Result := False;
      wd := FindWindow('Shell_TrayWnd', nil);
      if (wd = 0) then Exit;
    
      wtd := FindWindowEx(wd, 0, 'TrayNotifyWnd', nil);
      if (wtd = 0) then Exit;
    
      wtd := FindWindowEx(wtd, 0, 'SysPager', nil);
      if (wtd = 0) then Exit;
    
      wd1 := FindWindowEx(wtd, 0, 'ToolbarWindow32', nil);
      if (wd1 = 0) then Exit;
    
      pid := 0;
      GetWindowThreadProcessId(wd1, @pid);
      if (pid = 0) then Exit;
    
      hd := OpenProcess(PROCESS_ALL_ACCESS, true, pid);
      if (hd = 0) then Exit;
      num := SendMessage(wd1, TB_BUTTONCOUNT, 0, 0);
      sp := @_sp;
      for i := 0 to num do
      begin
        SendMessage(wd1, TB_GETBUTTON, i, integer(sp));
        pp := @p;
        ReadProcessMemory(hd, sp, pp, sizeof(p), n);
        name[0] := Char(0);
        if (Cardinal(p.iString) <> $FFFFFFFF) then
        begin
          try
            ReadProcessMemory(hd, pointer(p.iString), @name, 255, n);
            name[n] := Char(0);
          except
          end;
          temp := name;
          try
            whd := 0;
            ReadProcessMemory(hd, pointer(p.dwData), @whd, 4, n);
          except
          end;
          proid := 0;
          GetWindowThreadProcessId(whd, @proid);
          AFindList.Add(Format('%d_%s_%x_%x', [i, temp, whd, proid]));
          if CompareStr(temp, ADestStr) = 0 then Result := True;
        end;
      end;
    end;
    
    { 获取SQL Server用户数据库列表 }
    procedure YzGetSQLServerDBList(ADBHostIP, ALoginPwd: string;ADBList: TStringList);
    var
      PQuery: TADOQuery;
      ConnectStr: string;
    begin
      ConnectStr := 'Provider=SQLOLEDB.1;Password=' + ALoginPwd
        + ';Persist Security Info=True;User ID=sa;Initial Catalog=master'
        + ';Data Source=' + ADBHostIP;
      ADBList.Clear;
      PQuery := TADOQuery.Create(nil);
      try
        PQuery.ConnectionString := ConnectStr;
        PQuery.SQL.Text:='select name from sysdatabases where dbid > 6';
        PQuery.Open;
        while not PQuery.Eof do
        begin
          ADBList.add(PQuery.Fields[0].AsString);
          PQuery.Next;
        end;
      finally
        PQuery.Free;
      end;
    end;
    
    { 检测数据库中是否存在给定的表 }
    procedure YzGetTableList(ConncetStr: string;ATableList: TStringList);
    var
      FConnection: TADOConnection;
    begin
      FConnection := TADOConnection.Create(nil);
      try
        FConnection.LoginPrompt := False;
        FConnection.Connected := False;
        FConnection.ConnectionString := ConncetStr;
        FConnection.Connected := True;
        FConnection.GetTableNames(ATableList, False);
      finally
        FConnection.Free;
      end;
    end;
    
    { 将域名解释成IP地址 }
    function YzDomainToIP(HostName: string): string;
    type
      tAddr = array[0..100] of PInAddr;
      pAddr = ^tAddr;
    var
      I: Integer;
      WSA: TWSAData;
      PHE: PHostEnt;
      P: pAddr;
    begin
      Result := '';
      WSAStartUp($101, WSA);
      try
        PHE := GetHostByName(pChar(HostName));
        if (PHE <> nil) then
        begin
          P := pAddr(PHE^.h_addr_list);
          I := 0;
          while (P^[I] <> nil) do
          begin
            Result := (inet_nToa(P^[I]^));
            Inc(I);
          end;
        end;
      except
      end;
      WSACleanUp;
    end;
    
    { 移去系统托盘失效图标 }
    procedure YzRemoveDeadIcons();
    var
      hTrayWindow: HWND;
      rctTrayIcon: TRECT;
      nIconWidth, nIconHeight:integer;
      CursorPos: TPoint;
      nRow, nCol: Integer;
    Begin
      //Get tray window handle and bounding rectangle
      hTrayWindow := FindWindowEx(FindWindow('Shell_TrayWnd ', nil), 0, 'TrayNotifyWnd ', nil);
      if Not (GetWindowRect(hTrayWindow, rctTrayIcon)) then Exit;
      //Get small icon metrics
      nIconWidth := GetSystemMetrics(SM_CXSMICON);
      nIconHeight := GetSystemMetrics(SM_CYSMICON);
      //Save current mouse position   }
      GetCursorPos(CursorPos);
      //Sweep the mouse cursor over each icon in the tray in both dimensions
      for nRow := 0 To ((rctTrayIcon.bottom - rctTrayIcon.top) div nIconHeight) Do
      Begin
        for nCol := 0 To ((rctTrayIcon.right - rctTrayIcon.left) div nIconWidth) Do
        Begin
          SetCursorPos(rctTrayIcon.left + nCol * nIconWidth + 5,
            rctTrayIcon.top + nRow * nIconHeight + 5);
          Sleep(0);
        end;
      end;
      //Restore mouse position
      SetCursorPos(CursorPos.x, CursorPos.x);
      //Redraw tray window(to fix bug in multi-line tray area)
      RedrawWindow(hTrayWindow, nil, 0, RDW_INVALIDATE Or RDW_ERASE Or RDW_UPDATENOW);
    end;
    
    { 转移程序占用内存至虚拟内存 }
    procedure YzClearMemory;
    begin
      if Win32Platform = VER_PLATFORM_WIN32_NT then
      begin
        SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
        Application.ProcessMessages;
      end;
    end;
    
    { 检测允许试用的天数是否已到期 }
    function YzCheckTrialDays(AllowDays: Integer): Boolean;
    var
      Reg_ID, Pre_ID: TDateTime;
      FRegister: TRegistry;
    begin
      { 初始化为试用没有到期 }
      Result := True;
      FRegister := TRegistry.Create;
      try
        with FRegister do
        begin
          RootKey := HKEY_LOCAL_MACHINE;
          if OpenKey('Software/Microsoft/Windows/CurrentSoftware/'
            + YzGetMainFileName(Application.ExeName), True) then
          begin
            if ValueExists('DateTag') then
            begin
              Reg_ID := ReadDate('DateTag');
              if Reg_ID = 0 then Exit;
              Pre_ID := ReadDate('PreDate');
              { 允许使用的时间到 }
              if ((Reg_ID <> 0) and (Now - Reg_ID > AllowDays)) or
                (Pre_ID <> Reg_ID) or (Reg_ID > Now) then
              begin
                { 防止向前更改日期 }
                WriteDateTime('PreDate', Now + 20000);
                Result := False;
              end;
            end
            else
            begin
              { 首次运行时保存初始化数据 }
              WriteDateTime('PreDate', Now);
              WriteDateTime('DateTag', Now);
            end;
          end;
        end;
      finally
        FRegister.Free;
      end;
    end;
    
    { 指定长度的随机小写字符串函数 }
    function YzRandomStr(aLength: Longint): string;
    var
      X: Longint;
    begin
      if aLength <= 0 then exit;
      SetLength(Result, aLength);
      for X := 1 to aLength do
        Result[X] := Chr(Random(26) + 65);
      Result := LowerCase(Result);
    end;
    
    end.
  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/westsoft/p/8449590.html
Copyright © 2011-2022 走看看