Results 1 to 8 of 8

Thread: handle van een ander programma opvragen

  1. #1

    handle van een ander programma opvragen

    Hallo,

    Ik wil graag de handle verkrijgen van een programma dat op de achtergrond draait.
    Vanuit mijn applicatie wil ik dan een message naar dit achterliggende programma sturen.

    Bij het starten van het achterliggende programma laat ik via een messagebox de application.handle waarde zien.

    Wanneer ik deze gebruik in mijn andere applicatie kan ik idd een bericht van de ene applicatie naar de andere sturen.
    Kortom het idee werkt.
    Echter het lukt mij maar niet om de juiste handle op te vragen
    tot nu toe heb ik de volgende code
    Het lukt me hiermee wel om het programma dat op de achtergrond draait te vinden, maar ik krijg dan niet de juiste handle

    Code:
    function Tbasis_mainform.GetArgusHandle: Hwnd;
    var
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
      ExeFileName: string;
    
    begin
      Result := 0;
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
      ExeFileName:='Argus.exe';
      while Integer(ContinueLoop) <> 0 do
      begin
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  UpperCase(ExeFileName)) or
           (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
        begin
    
         result:= OpenProcess(PROCESS_ALL_ACCESS,False,FProcessEntry32.th32ProcessID);
        end;
    
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
      CloseHandle(FSnapshotHandle);
    end;
    Als ik de application.handle opvraag krijg ik altijd een groot getal terug (7 cijfers)
    de Handle die ik terug krijg van openProcess is altijd zo rond de 1400.
    Kortom ik ben appels met peren aan het vergelijken.

    Weet iemand hoe ik wel de juiste handle terug kan krijgen

    Alvast bedankt

  2. #2
    Heeft het programma dat je zoekt een zichtbaar venster? Anders kan je de handle van het venster opvragen. Je zou dat zo kunnen doen, of zoals hier op SO uitgelegd wordt.

  3. #3

  4. #4
    Die code krijgt volgens mij een process handle. Die kan mogelijk zelfs verschillen per call. Je draaiende process heeft een process ID, en als je dat proces opent krijg je een specifieke process handle.

    En beide staan los van Application.Handle, wat een verwijzing is naar een window handle die de applicatie maakt, om messages van Windows of andere applicaties op te ontvangen.

    Met EnumWindows kan je door alle top level windows heen lopen. Ik denk dat je aan de naam of titel van dat window moet kunnen zien of het de applicatie of het (main)form is.

    Met GetWindowThreadProcessId kan je kijken bij welk proces zo'n window hoort. Dat kan je dan weer combineren met je huidige code om zeker te weten dat het bij de juiste exe hoort.
    Op SwissDelphiCenter staat een voorbeeldje hoe je de exe naam opvraagt o.b.v. een Window handle, misschien nog nuttig.
    1+1=b

  5. #5
    Inmiddels gelukt met een combinatie van de stukjes code.
    Ik haal nu met EnumWindows een lijst op met alle handles.
    Daar zit ook de handle tussen waar ik naar op zoek was.
    Daarna vraag ik voor alle handles de GetWindowText en de GetClassName

    Wanneer ik nu de naam van het programma tegenkom met als ClassName Tapplication dan heb ik de juiste handle gevonden

    Code:
    var
      WindowList: TList;
    
    function TForm1.GetHandle (windowtitle: string): HWND;
    var
      h, TopWindow: HWND;
      Dest: array[0..256] of char;
      i: integer;
      s: string;
      ClassName:string;
      buf: array[0..255] of Char;
    
      function getWindows(Handle: HWND; Info: Pointer): BOOL; stdcall;
        begin
          Result:= True;
          WindowList.Add(Pointer(Handle));
        end;
    
    begin
      result:= 0;
    
      try
        WindowList:= TList.Create;
        TopWindow:= Application.Handle;
        EnumWindows(@getWindows, Longint(@TopWindow));
    
        i:= 0;
        while (i < WindowList.Count) and (result = 0) do
          begin
    
            GetWindowText(HWND(WindowList[i]), Dest, sizeof(Dest) - 1);
    
            s:= dest;
            GetClassName(HWND(WindowList[i]), @buf, Length(buf));
            ClassName:=buf;
            Listbox1.Items.Add(inttostr( HWND(WindowList[i]))+' '+buf+ ' '+s);
            if length(s) > 0 then
              begin
                if (Pos(UpperCase(Windowtitle), UpperCase(s)) >= 1) and (ClassName = 'TApplication')  then
                  begin
                    h:= HWND(WindowList[i]);
                    if IsWindow(h) then
                      result:= h
                 end
               end;
            inc(i)
          end
        finally
          WindowList.Free;
        end;
    end;

  6. #6
    Waarom doe je dan niet gewoon zo:
    Delphi Code:
    1. ExternalWindowHandle := FindWindow(Windowtitle, 'TApplication');

    Zo zoekt hij specifiek de window met de title uit WindowTitle en als classname 'TApplication'.

  7. #7
    Helaas werkt duze code niet.
    Ik blijf als handle 0 terug krijgen

  8. #8
    FindWindow wil eerst de classname, dan de title. Bovendien moet de title dan exact overeenkomen. Het is niet hoofdlettergevoelig, maar werkt niet met gedeeltelijke matches, wat met `Pos` natuurlijk wel kan.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •