Co do pierwszego - nie znam odpowiedzi, ale w Windows nie wysyła się przerwań/sygnałów wyłączających urządzenie. Wystarczy wywołać odpowiednią funkcję systemową.
Co do drugiego. Oczywiście, że można zarządzać usługami.za pomocą Delphi. Możesz to zrobić funkcjami systemowymi, albo - prościej przez wywołanie programu konsolowego, choćby tak:
sc stop USLUGA
Jeśli jednak chcesz funkcjami to możesz tak (stworzyłem na szybko):
function ServiceStop(Service:string; Machine:string = ''):boolean;
var SCManager, SCService: SC_Handle;
SCStatus: TServiceStatus;
Check: DWord;
begin
SCManager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
if (SCManager>0) then
begin
SCService := OpenService(SCManager, PChar(Service), SERVICE_STOP or SERVICE_QUERY_STATUS);
if (SCService>0) then
begin
if (ControlService(SCService, SERVICE_CONTROL_STOP, SCStatus)) then
begin
if (QueryServiceStatus(SCService, SCStatus)) then
while (SERVICE_STOPPED<> SCStatus.dwCurrentState)do
begin
Check := SCStatus.dwCheckPoint;
Sleep(SCStatus.dwWaitHint);
if (not QueryServiceStatus(SCService, SCStatus)) or (SCStatus.dwCheckPoint<Check) then
break;
end;
end;
CloseServiceHandle(SCService);
end;
CloseServiceHandle(SCManager);
end;
result:=(SERVICE_STOPPED=SCStatus.dwCurrentState);
end;
Wywołanie:
ServiceStop('USLUGA'); // lub
ServiceStop('USLUGA', '\NAZWAKOMPUTERA');