Results 1 to 4 of 4

Thread: Opvragen handle van extern programma

  1. #1

    Opvragen handle van extern programma

    Voor het verkrijgen van een handle van extern programma gebruik ik extHwnd := getHandle('Naamloos - Kladblok');
    Code:
    function GetHandle (windowtitle: string): HWND;
    var
      h, TopWindow: HWND;
      Dest: array[0..80] of char;
      i: integer;
      s: string;
    
      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;
            if length(s) > 0 then
              begin
                if (Pos(UpperCase(Windowtitle), UpperCase(s)) >= 1) then
                  begin
                    h:= HWND(WindowList[i]);
                    if IsWindow(h) then
                      result:= h
                 end
               end;
            inc(i)
          end
        finally
          WindowList.Free;
        end;
    end;
    Dat werkt prima. Maar omdat ik niet altijd de exacte titel weet gaat dit soms (vaak) fout. Daarom zou ik graag de bestandsnaam, in dit geval dus notepad.exe, hiervoor gebruiken.

    Ik heb verschillende voorbeelden die op internet staan geprobeerd. Maar bij geen een krijg ik de goed handle. Deze handle wil ik gebruiken om het programma op de juiste positie te zetten met SetWindowPos

    Ik zoek dus een manier om een betrouwbare handle van een extern programma te krijgen.

    [edit]
    Opgelost door het opvragen van het PID en deze om te zetten naar de handle.
    Last edited by Greta; 15-Jul-21 at 15:55.
    Niets is zo gemakkelijk als het lijkt.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Overigens: De geneste getwindows is niet portable. (het hangt er vanaf of en waar de frame pointer van de parent wordt doorgegeven). Dit raad ik af.

  3. #3
    Greta,

    Ik heb de code van jou getest maar ik krijg het niet werkend. Het gaat fout op de regel : EnumWindows(@getWindows, Longint(@TopWindow));
    Graag zou ik de code van de oplossing willen zien en gebruiken. Ik zit namelijk met het zelfde probleem.
    Met een vriendelijke groet en alvast bedankt, Frans

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    - Als reeds gezegd, getwindows dient een globale procedure te zijn, niet een geneste
    - casten van een pointer naar een longint is niet 64-bit compatible.

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
  •