>hejhej: Tak for dit svar. Jeg går ud fra at "vinduets navn" er Caption. Kan man ikke på en eller anden måde søge på applikationens navn f.eks. "finans.exe"?
Synes godt om
Slettet bruger
05. august 2003 - 07:24#3
Tilføj TlHelp32 til uses.
Type TEnumData = Record hW: HWND; pID: DWORD; 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 }
procedure TForm1.Timer1Timer(Sender: TObject); begin If WindowFromAppname32('Project1.exe') <> 0 then ShowMessage('Project1 kører'); end;
er det så muligt at lukke det vindue der er blevet fundet
Synes godt om
Slettet bruger
05. august 2003 - 14:15#5
Ja, tror det her virker.. erstat din timer procedure med denne:
procedure TForm1.Timer1Timer(Sender: TObject); var Programmet:HWND; begin Programmet := WindowFromAppname32('Project1.exe'); If Programmet <> 0 then SendMessage(Programmet,WM_CLOSE,0,0); end;
Synes godt om
Slettet bruger
05. august 2003 - 14:17#6
Ellers virker det her ihvertfald, hvis du bare vil lukke programmet:
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;
procedure TForm1.Timer1Timer(Sender: TObject); begin KillTask('Project1.exe') end;
hvad er Function WindowFromProcessID( pID: DWORD ): HWND; til så
Synes godt om
Slettet bruger
05. august 2003 - 23:05#8
Den skal du ikke bruge, ellers kan du bruge den hvis du har processid'et.
Synes godt om
Slettet bruger
06. august 2003 - 21:08#9
Takker for point :D
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.