Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle eines Programmes - nur Pfad bekannt (https://www.delphipraxis.net/58601-handle-eines-programmes-nur-pfad-bekannt.html)

Mazel 9. Dez 2005 13:15


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

ichbins 9. Dez 2005 13:32

Re: Handle eines Programmes - nur Pfad bekannt
 
Such alle Programmhandles und teste bei einem nach dem anderen ob es den entsprechenden Pfad hat.

NicoDE 9. Dez 2005 14:46

Re: Handle eines Programmes - nur Pfad bekannt
 
Zitat:

Zitat von Mazel
Nun will ich aber nicht nur das Programm staren sonder auch noch das Handle.

Welche Funktion benutzt um das Programm zu starten?

Mazel 9. Dez 2005 16:15

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:
ShellExecute(Application.Handle, 'open' , PChar(Edit1.Text), nil, nil, sw_ShowNormal);
Dieses Application.Handle ist doch das Handle meines Programmes, daher weis ich nicht wie ich an das Handle der aufrufenden Datei heran komme.

ichbins 9. Dez 2005 16:20

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.

Mazel 9. Dez 2005 16:49

Re: Handle eines Programmes - nur Pfad bekannt
 
Danke, werde mir mal die Unit anschauen.

NicoDE 9. Dez 2005 16:57

Re: Handle eines Programmes - nur Pfad bekannt
 
Zitat:

Zitat von Mazel
aufrufen tue ich die Programme mit ShellExecute

An das Prozess-Handle gelangst du nur durch die Verwendung von MSDN-Library durchsuchenShellExecuteEx.

Zitat:

Zitat von Mazel
Dieses Application.Handle ist doch das Handle meines Programmes[...]

Nun ist die Frage was du unter "Handle meines Prozesses" verstehst. Application.Handle ist das Fenster-Handle vom Eintrag in der Task-Leiste.

Mazel 9. Dez 2005 17:22

Re: Handle eines Programmes - nur Pfad bekannt
 
Hab nun folgendes probiert, aber das funktioniert nicht:

Delphi-Quellcode:
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;
@NicoDE: Danke für den Hinweis von Application.Handle.


Gruß
Mazel

NicoDE 9. Dez 2005 18:01

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;

Mazel 9. Dez 2005 18:23

Re: Handle eines Programmes - nur Pfad bekannt
 
Danke für den Code, funktioniert sehr gut. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz