function IsFileInUse(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 TForm1.Timer1Timer(Sender: TObject); begin if IsFileInUse('c:\a.txt') then ShowMessage('文件正在使用'); end; //這是飯桶的方法,不過態浪費系統資源,在此貼中也有另一個辦法。 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200034
这种方法我估计不可靠, 因为.wav可以作被装载到内存中播放n次, 如果你监视那可能只会只得到一次装载使用. 不过当然这和CS的实现有关. 好一点的方法是应该是Hook API call尤其是DirectX的.
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 TForm1.Timer1Timer(Sender: TObject);
begin
if IsFileInUse('c:\a.txt') then
ShowMessage('文件正在使用');
end; //這是飯桶的方法,不過態浪費系統資源,在此貼中也有另一個辦法。
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200034