02. september 2004 - 01:37
Der er
1 kommentar og
1 løsning
Blokere for programstart
Hej
Er det muligt at man kan blokere for start af program på en klient ud fra programmets navn. Det skal gerne fungere således at hvis man har programmets navn eks. kazza.exe og en bruger prøver at starte kazza så lukker klienten kazza ned.
02. september 2004 - 14:29
#1
Jeg ved ikke hvordan du hook'er explorer så at du får en meddelse når et program starter, men du kan tjekke med et interval om programmet kører og så hvis det kører så lukke det.
Her er lige et par nødvendig procedurer:
type
TEnumData = Record
hW: HWND;
pID: DWORD;
End;
function KillTask(ExeFileName: string): Integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(0),
FProcessEntry32.th32ProcessID),
0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Function EnumProc( hw: HWND; Var data: TEnumData ): Bool; stdcall;
Var
pID: DWORD;
Begin
Result := True;
If (GetWindowLong(hw, GWL_HWNDPARENT) = 0) and
(IsWindowVisible( hw ) or IsIconic(hw))
Then Begin
GetWindowThreadProcessID( hw, @pID );
If pID = data.pID Then Begin
data.hW := hW;
Result := False;
End; { If }
End; { If }
End; { EnumProc }
Function WindowFromProcessID( pID: DWORD ): HWND;
Var
data: TEnumData;
Begin
data.pID := pID;
data.hW := 0;
EnumWindows( @EnumProc, longint(@data) );
Result := data.hW;
End; { WindowFromProcessID }
Function WindowFromAppname32( appname: String ): HWND;
{ Take only the application filename, not full path!
Need to pass the extension as well. }
Var
snapshot: THandle;
processEntry : TProcessEntry32;
Begin
Result := 0;
snapshot := CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS,
0 );
If snapshot <> 0 Then
try
processEntry.dwSize := Sizeof( processEntry );
If Process32First( snapshot, processEntry ) Then
Repeat
If AnsiCompareText(
appname,
ExtractFilename( StrPas(processEntry.szExeFile))
) = 0
Then Begin
Result:= WindowFromProcessID( processEntry.th32ProcessID);
Break;
End; { If }
Until not Process32Next( snapshot, processEntry );
finally
CloseHandle( snapshot );
End; { try }
End; { WindowFromAppname32 }
og så kan du chekke således:
if WindowFromAppname32('kazza.exe') <> 0 then
KillTask('kazza.exe'); // og luk programmet hvis det kører ....
// Jonat.