kostenloser Webspace werbefrei: lima-city


Handle abrufen über PID

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Hi,

    Wie kann ich in Delphi das Mainwindow Handle von einem Prozess abrufen, von dem ich die Prozess-ID kenne?

    h: HWND;
    h := OpenProcess(PROCESS_ALL_ACCESS,False,MyPID);

    funktioniert nicht bzw. bekomm ich damit nicht das Hauptfenster, v.a. wenn das fremde Programm eine Delphi-Anwendung ist, denn bei diesen ist das Hauptfenster versteckt, also brauche ich davon das Fenster, das der Benutzer sieht. :confused:

    Ich hoffe, dass ihr mir helfen könnt ;)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Du willst zwar nicht den Fenster-Handle über den EXE-Namen, aber das hier sollte helfen:
    http://www.dsdt.info/tipps/?id=638

    Frage: bist du nicht normalerweise ein VB-Programmierer? :eek:
  4. Autor dieses Themas

    cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.


    Du willst zwar nicht den Fenster-Handle über den EXE-Namen, aber das hier sollte helfen:
    http://www.dsdt.info/tipps/?id=638

    Frage: bist du nicht normalerweise ein VB-Programmierer? :eek:


    In Delphi war mir das zu umständlich, dein Tipp hat auch nicht weitergeholfen...
    Jetzt hab ich es in C++ gelöst ;)

    P.S.: Ja meistens arbeite ich mit Visual Basic, des Öfteren aber auch mit Delphi oder auch ab und zu mit C / C++ :cool:


    Nachtrag:

    Ich brauch jetzt doch trotzdem eine Lösung für Delphi...

    Testweise hab ich\'s mit FindWindow() probiert und damit funktioniert es.
    Allerdings will ich das Handle nicht über den Titel bekommen, sondern über die Process ID, denn es gibt eventuell mehrere Anwendungen mit dem gleichen Titel.

    Die Process ID hab ich bereits ermittelt. Jetzt will ich über die PID das Handle erhalten?

    Beitrag geändert: 7.1.2008 18:45:38 von cbhp
  5. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.


    Ich brauch jetzt doch trotzdem eine Lösung für Delphi...

    Testweise hab ich\'s mit FindWindow() probiert und damit funktioniert es.
    Allerdings will ich das Handle nicht über den Titel bekommen, sondern über die Process ID, denn es gibt eventuell mehrere Anwendungen mit dem gleichen Titel.

    Die Process ID hab ich bereits ermittelt. Jetzt will ich über die PID das Handle erhalten?

    Beitrag geändert: 7.1.2008 18:45:38 von cbhp


    Laß\' mal den Source für C++ ansehen, vielleicht finde ich dann leichter eine Lösung für Delphi!

    Hab\' nochmal gegoogelt: Du hast die Lösung eh selbst gefunden. Mit einer Schleife die Fenster durchsuchen, vom Fenstertitel die PID holen, und die dann mit der PID vergleichen, die du ja schon hast -> gefunden!
    Ist zwar in VB, aber die Idee ist ja gut:
    http://support.microsoft.com/kb/242308/de

    Beitrag geändert: 8.1.2008 7:40:19 von burgi
  6. Autor dieses Themas

    cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.



    burgi schrieb:
    Laß\\\' mal den Source für C++ ansehen, vielleicht finde ich dann leichter eine Lösung für Delphi!

    Hab\\\' nochmal gegoogelt: Du hast die Lösung eh selbst gefunden. Mit einer Schleife die Fenster durchsuchen, vom Fenstertitel die PID holen, und die dann mit der PID vergleichen, die du ja schon hast -> gefunden!
    Ist zwar in VB, aber die Idee ist ja gut:
    http://support.microsoft.com/kb/242308/de

    Beitrag geändert: 8.1.2008 7:40:19 von burgi


    Ja das wäre eine Lösung, die mir aber zu umständlich wirkt und doppelt so lange dauert.
    Da muss es doch was einfacheres auch geben...

    Mein C++ Code wird wohl kaum auf Delphi übertragbar sein, denn ich hab .Net Framework verwendet und ich hab nur Delphi 7.
    System::Diagnostics::Process^ myProcess = System::Diagnostics::Process::GetProcessById(myPid);
    System::IntPtr myHWND = myProcess->MainWindowHandle;
  7. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.


    Ja das wäre eine Lösung, die mir aber zu umständlich wirkt und doppelt so lange dauert.
    Da muss es doch was einfacheres auch geben...

    Mein C++ Code wird wohl kaum auf Delphi übertragbar sein, denn ich hab .Net Framework verwendet und ich hab nur Delphi 7.
    System::Diagnostics::Process^ myProcess = System::Diagnostics::Process::GetProcessById(myPid);
    System::IntPtr myHWND = myProcess->MainWindowHandle;



    Leider hhast du Recht! Das geht nicht einfacher! Hab\' trotz intensiven Googelns nichts passendes gefunden, auch nicht bei CodeGear.
    Tut Leid!
    Aber laß\' es mich wissen, solltest du trotzdem noch eine Lösung finden!
  8. Autor dieses Themas

    cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Nun hab ich die Lösung gefunden:

    Deklaration
    type
      PEnumInfo = ^TEnumInfo;
      TEnumInfo = record ProcessID: DWORD; HWND: THandle; end;


    Benötigte Funktionen
    function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
        var
          PID: DWORD;
        begin
          GetWindowThreadProcessID(Wnd, @PID);
          Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND));
          if not Result then EI.HWND := WND;
        end;
    
      function FindMainWindow(PID: DWORD): DWORD;
        var
          EI: TEnumInfo;
        begin
          EI.ProcessID := PID;
          EI.HWND := 0;
          EnumWindows(@EnumWindowsProc, Integer(@EI));
          Result := EI.HWND;
        end;



    Verwendung
    myHwnd := FindMainWindow(myPID);


    Schon erhält man über die Prozess-ID das MainWindowHandle (HauptHandle), wie es auch FindWindow() zurückgeben würde.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!