webForumDet fria alternativet

Stänga program man själv startat från delphi

Programmeringur Programmering - Övrigt

2 svar · 253 visningar · startad av Davida

Medlem sedan okt. 2000219 inlägg
Frågan#1

Jag använder följande kod för att starta ett program:

shellexecute(self.Handle,'OPEN',strpcopy(a,'index.htm'),nil,nil,SW_NORMAL);

Hur gör jag för att stänga detta programmet sedan

Medlem sedan okt. 20013 217 inlägg
#2

Returnerar inte shellexecuta nått som du sedan kan använda dig av för att komma åt processen du startade ?

Medlem sedan juni 2000350 inlägg
#3

shellexecute returnerar inget som du kan använda använd CreateProcess istället.

Modifiera och testa med exemplet nedan
Du borde även kunna använda TerminateProcess(istället för WM_CLOSE) , men den stänger nog programmet ganska rått.

{+----------------------------------------------------------------------
| Function WinExecEx
|
| Parameters :
| FileName : name of application to start, may contain parameters
| Visibility: one of the ShowWindow visibility flags
| Returns : the thread ID of the started processes main thread.
| Error Conditions:
| Will raise an EWin32Error exception if the CreateProcess call fails.
| Created: 22.10.1999 by P. Below
+----------------------------------------------------------------------}
Function WinExecEx( FileName : String ; Visibility : integer ) : DWORD ;
Var
zAppName:array[0..512] of char;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
Begin
Result := 0;
StrPCopy(zAppName,FileName);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
If not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
False, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) { pointer to PROCESS_INF }
Then
RaiseLastWin32Error
Else Begin
Result:= ProcessInfo.dwThreadId;
CloseHandle( ProcessInfo.hProcess );
CloseHandle( ProcessInfo.hThread );
End;
End; { WinExecEx }

Function EnumProc( aWnd: HWND; Var wnd: HWND ): BOOL; stdcall;
Begin
Result := True;
If (GetWindowLong(aWnd, GWL_HWNDPARENT) = 0) and
(IsWindowVisible( aWnd ) or IsIconic(aWnd))
Then Begin
Result := False;
wnd:= aWnd;
End; { If }
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
threadID: DWORD;
wnd: HWND;
buf: Array [0..255] of char;
Begin
threadID:= WinexecEx('edit.com', SW_SHOWNORMAL );
Sleep( 1000 );
wnd:= 0;
EnumThreadWindows( threadID, @EnumProc, integer(@wnd));
memo1.clear;
memo1.lines.add( Format('Found window, handle: %d',[wnd]));
GetClassname( wnd, buf, sizeof(buf));
memo1.lines.add( Format('Classname is %s', [ buf ]));
SendMessage( wnd, WM_GETTEXT, Sizeof(buf), integer(@buf));
memo1.lines.add( Format('Caption is %s', [ buf ]));
memo1.lines.add( 'Now trying to close this window...');
SendMessage( wnd, WM_CLOSE, 0, 0 );
End;

268 ms totalt · 3 externa anrop · v20260731065814-full.9823c0c5
142 ms — hämta forumlista (db)
123 ms — hämta statistik (db)
140 ms — hämta tråd, inlägg och bilagor (db)