02. september 2004 - 01:37Der 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.
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 ....
Du skal forresten også lige tilføje "TlHelp32" til Users.....
// Jonat.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.