Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Titelloses Fenster eines Fremdprogrammes positionieren? (https://www.delphipraxis.net/130450-titelloses-fenster-eines-fremdprogrammes-positionieren.html)

PeterPanino 9. Mär 2009 02:14

Re: Titelloses Fenster eines Fremdprogrammes positionieren?
 
Zitat:

Zitat von verwirrt
Zitat:

Zitat von PeterPanino
Jetzt muss ich nur noch eine Methode finden, die Koordinaten des Fensters zu ändern.

SetWindowRect

Mhm, über SetWindowRect habe ich im Zusammenhang mit Delphi nichts Ergiebiges gefunden, wohl aber bei SetWindowPos:

Delphi-Quellcode:
SetWindowPos(AHandle,
             HWND_TOPMOST,
             rc.Left, rc.Top-100, rc.Right - rc.Left, rc.Bottom - rc.Top,
             SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
Mit diesem Code kann ich zwar ein anderes Fenster bewegen, aber - wie Luckie bemerkt hat - funktioniert offensichtlich das Identifizieren des gesuchten Fensters mit "FindWindow('#32770', nil)" nicht, da ein anderes Fenster bewegt wird und nicht dasjenige, für das ich mit WinSpy++ den Class Name gefunden habe. Also wieder zurück an den Start und mit einer anderen Methode das gewünschte Fensterhandle finden.

PeterPanino 9. Mär 2009 03:15

Re: Titelloses Fenster eines Fremdprogrammes positionieren?
 
Ich hab's jetzt endlich geschafft, das richtige Fensterhandle und die richtigen Fensterkoordinaten zu bekommen. Dazu musste ich die Funktion GetMainAppWndFromPid etwas ändern:

Delphi-Quellcode:
function GetMainAppWndFromPid(PID: DWORD): THandle;
type
  PSearch = ^TSearch;
  TSearch = record
    PID: DWORD;
    Wnd: THandle;
  end;
var
  SearchRec: TSearch;

  function EnumWindowsProc(Wnd: THandle; Res: PSearch): Boolean; stdcall;
  var
    WindowPid: DWORD;
  begin
    WindowPid := 0;
    GetWindowThreadProcessId(Wnd, @WindowPid);
    if (WindowPid = Res^.PID) then //and IsMainAppWindow(Wnd) then // <--- <--- <---
    begin
      Res^.Wnd := Wnd;
      Result := False;
    end
    else
      Result := True;
  end;

begin
  SearchRec.PID := PID;
  SearchRec.Wnd := 0;
  EnumWindows(@EnumWindowsProc, Integer(@SearchRec));
  Result := SearchRec.Wnd;
end;
Ich habe die Bedingung and IsMainAppWindow(Wnd) rausgenommen (s. oben), weil mein gesuchtes Fenster kein Hauptfenster hat. Die Frage ist jetzt aber, wie ich diese Funktion so verallgemeinern kann, dass sie mit allen Fenstertypen funktioniert?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 2 von 2     12   

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