- {*******************************************************}
- { }
- { Delphi公用函数单元 }
- { }
- { 版权所有 (C) 2008 勇者工作室 }
- { }
- {*******************************************************}
- unit UMyPubFuncFroc;
-
- 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.