![]() |
Handle eines Programmes - nur Pfad bekannt
Hi,
hab ein großes Problem. Ich bin gerade dabei ein eine Art Schnellstarter zu programmieren. Man gibt in ein EditFeld einen Pfad Beispiel: C:\Programme\MeinProgramm\Programm.exe ein. Nun will ich aber nicht nur das Programm staren sonder auch noch das Handle. Auch wenn es in der TNA also rechts neben der Uhr liegt, und sonst kein Fenster erscheint. Ist das überhaupt möglich? Gruß Mazel |
Re: Handle eines Programmes - nur Pfad bekannt
Such alle Programmhandles und teste bei einem nach dem anderen ob es den entsprechenden Pfad hat.
|
Re: Handle eines Programmes - nur Pfad bekannt
Zitat:
|
Re: Handle eines Programmes - nur Pfad bekannt
Hi,
danke erstmal für die Antworten. @ichbins: wie kann ich alle Fensterhandles bekommen, hab es mit FindWindow probiert, da kommt aber als Handle immer 0. @NicoDE: aufrufen tue ich die Programme mit ShellExecute
Delphi-Quellcode:
Dieses Application.Handle ist doch das Handle meines Programmes, daher weis ich nicht wie ich an das Handle der aufrufenden Datei heran komme.
ShellExecute(Application.Handle, 'open' , PChar(Edit1.Text), nil, nil, sw_ShowNormal);
|
Re: Handle eines Programmes - nur Pfad bekannt
Liste der Anhänge anzeigen (Anzahl: 1)
Schau dir mal die Unit processinfo von Luckie an. Mit der hab ich schon ne Art taskmanager programmiert. Daraus habe ich folgende Unit extrahiert:
Delphi-Quellcode:
unit Process;
interface uses windows,tlhelp32; type tprocessarray=array of tprocessentry32; procedure actprocesses; var processes:tprocessarray; implementation function EnableDebugPrivileges(bEnable: Boolean; var PreviousState: Boolean): DWORD; const SE_DEBUG_NAME = 'SeDebugPrivilege'; var Token: THandle; NewState: TTokenPrivileges; Luid: TLargeInteger; PrevState: TTokenPrivileges; Return: DWORD; begin PreviousState := TRUE; if (GetVersion() > $80000000) then // Win9x Result := ERROR_SUCCESS else begin // WinNT if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then Result := GetLastError() else try if not LookupPrivilegeValue(nil, SE_DEBUG_NAME, Luid) then Result := GetLastError() else begin NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := Luid; if bEnable then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; if not AdjustTokenPrivileges(Token, False, NewState, SizeOf(TTokenPrivileges), PrevState, Return) then Result := GetLastError() else begin Result := ERROR_SUCCESS; PreviousState := (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0); end; end; finally CloseHandle(Token); end; end; end; function Getprocesses(var processes:tprocessarray): Integer; var hSnapShot : Cardinal; pe32 : TProcessEntry32; cntP : Integer; v : boolean; begin setlength(processes,0); EnableDebugPrivileges(true,v); result := 0; hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hSnapShot <> 0 then begin ZeroMemory(@pe32, sizeof(pe32)); pe32.dwSize := sizeof(ProcessEntry32); cntP := 0; if Process32First(hSnapShot, pe32) = true then begin while Process32Next(hSnapShot, pe32) = true do begin setlength(processes,length(processes)+1); processes[length(processes)-1]:=pe32; Inc(cntP); end; result := cntP; end; end; EnableDebugPrivileges(false,v); end; procedure actprocesses; begin getprocesses(processes); end; initialization getprocesses(processes); end. |
Re: Handle eines Programmes - nur Pfad bekannt
Danke, werde mir mal die Unit anschauen.
|
Re: Handle eines Programmes - nur Pfad bekannt
Zitat:
![]() Zitat:
|
Re: Handle eines Programmes - nur Pfad bekannt
Hab nun folgendes probiert, aber das funktioniert nicht:
Delphi-Quellcode:
@NicoDE: Danke für den Hinweis von Application.Handle.
procedure TForm1.BtnStartClick(Sender: TObject);
var Wnd: HWnd; begin ShellExecute(Wnd, 'open' , PChar(Edit1.Text), nil, nil, sw_ShowNormal); If Wnd <> 0 then ShowMessage(IntToStr(Wnd)); end; Gruß Mazel |
Re: Handle eines Programmes - nur Pfad bekannt
Hier mal ein Beispiel mit ShellExecuteEx:
Delphi-Quellcode:
uses
ShellAPI; procedure TForm1.Button1Click(Sender: TObject); var SEEInfo: TShellExecuteInfo; begin ZeroMemory(@SEEInfo, SizeOf(TShellExecuteInfo)); with SEEInfo do begin cbSize := SizeOf(TShellExecuteInfo); fMask := SEE_MASK_DOENVSUBST or SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS; Wnd := Handle; lpVerb := 'open'; lpFile := PChar(Trim(Edit1.Text)); nShow := SW_SHOWDEFAULT; end; if not ShellExecuteEx(@SEEInfo) then ShowMessage(SysErrorMessage(GetLastError())) else if SEEInfo.hProcess = 0 then ShowMessage('Kein Prozess-Handle!') else try // Warten bis Anwendung initialisiert ist... WaitForInputIdle(SEEInfo.hProcess, INFINITE); ShowMessage('ok'); // Warten bis Anwendung beendet ist... WaitForSingleObject(SEEInfo.hProcess, INFINITE); ShowMessage('done'); finally CloseHandle(SEEInfo.hProcess); end; end; |
Re: Handle eines Programmes - nur Pfad bekannt
Danke für den Code, funktioniert sehr gut. :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz