Hallo!
Ich komm grad irgendwie nicht weiter. Ich hab eine Funktion, der ich einen WindowTitle übergebe und die mir das Handle dieses Windows zurückgibt:
public IntPtr GetWindowHandle(string processNamePart)
{
Process[] processes = Process.GetProcesses();
foreach(Process p in processes)
{
if(p.MainWindowTitle.Contains(processNamePart))
return p.MainWindowHandle;
}
return new IntPtr(0); // nicht gefunden
}
Wie kann ich nun mit diesem windowHandle die Größe und Position des zugehörigen Fensters ermitteln? Ich hab dazu bisher keine Möglichkeit in C# gefunden. Wäre nett, wenn mir da jemand weiterhelfen kann.
Gruß, Nico.
Hallo nico2009,
herzlich willkommen hier.
Auf jeden Fall solltest du mit der normalen API Funktion GetWindowRect die Abmessungen bekommen, denke ich.
Ohne es jetzt direkt per Code ausprobiert zu haben, solltest du die API - Funktion entsprechend deklarieren und dann kannst du sie verwenden.
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
Gruß
EDIT @michlG
Passt schon - beide Beiträge zusammen machen es erst rund 😉
Hallo nico2009
versuchs mal so
RECT windowRectangle;
GetWindowRect(windowhandle, out windowRectangle);
int links = windowsRectangle.Left;
Da gibt es die Eigenschaften Left, Right, Top, Bottom, dann musst du dir halt selbst die Größe berechnen.
Gruss
Michael
EDIT:
Oha, da hab ich proper_csharp übersehn, sry 😃
Omg. Während ich meine Lösung geschrieben habe, gab es zwei weitere Beiträge.
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref RECT rc);
IntPtr wnd;
RECT rc;
int breite;
int hoehe;
int x;
int y;
private void GetLocation()
{
int hwnd = wnd.ToInt32();
GetWindowRect(hwnd, ref rc);
breite = rc.right - rc.left;
hoehe = rc.bottom - rc.top;
x = rc.left;
y = rc.top;
}
Das hab ich so schon probiert. Ich vermute, statt RECT muss bei der Importfunktion Rectangle stehen, oder? Ich verwende es mit Rectangle, da C# RECT bei mir nicht akzeptiert.
Das Problem ist, dass dabei falsche Werte rauskommen. Für das Fenster, für das ich die Position ermitteln will, bekomme ich z.B. immer Left=512, Top=384 raus, egal wo ich das Fenster hinschiebe.
Was mir bisher auch unklar ist, ist wie die Struktur RECT aus Win32, die nur left, top, right & bottom enthält auf das Rectangle von C# gemappt wird, was ja zusätzlich noch X, Y, Width, Height und ein paar andere Werte enthält.
Kann es sein, dass beim Import von GetWindowRect() was schiefgeht? Oder muss ich RECT auch erst noch in C# importieren?
Der Vollständigkeit halber - meine Import-Deklaration sieht im Moment so aus:
[DllImport("user32.dll", SetLastError=true)]
static extern bool GetWindowRect(IntPtr hWnd, out Rectangle lpRect);
Hallo nico2009,
habe mal folgendes kurz ausprobiert - ich bekomme vernünftige Werte. Die RECT Struktur musst du anlegen, dann geht es.
EDIT:
Siehe auch bei Progi123. Da wäre auch noch eine Konvertierung, falls gewünscht.
public IntPtr GetWindowHandle(string processNamePart)
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in processes)
{
if (p.MainWindowTitle.Contains(processNamePart))
return p.MainWindowHandle;
}
return new IntPtr(0); // nicht gefunden
}
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
Dann testweise verwendet (sinnfreier dummy-Code, im Debugger Werte angesehen)
RECT windowRectangle;
GetWindowRect(GetWindowHandle("Windows Task-Manager"), out windowRectangle);
int links = windowRectangle.left;
return;
Gruß