打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
delphi公用函数
quasiceo
>《待分类1》
2014.07.25
关注
{*******************************************************}
{ }
{ 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
.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
delphi 获取网络文件大小
vclZip控件的使用
delphi基础开发技巧
XML编程手记,XML操作类
Delphi 的接口
字符串操作中较常用的函数
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×