{*******************************************************}  
{                                                       }  
{             Delphi公用函数单元                        }  
{                                                       }  
{        版权所有 (C) 2008                           }  
{                                                       }  
{*******************************************************}  
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.