| 

.NET C# Java Javascript Exception

2
Hallo Leute,

ich stehe vor folgender Aufgabe (C#): Man stelle sich vor es laufen drei Anwendungen, beispielsweise Outlook, Word und Firefox. Die Hauptfenster sind alle sichtbar (also nicht in der Taskleiste minimiert) und überlagern sich gegenseitig. Die Frage ist nun, wie man herausbekommt welches der drei Fenster ganz oben liegt, welches in der Mitte und welches unten.

Welche Anwendungen laufen, kann ich abfragen und deren Titel, Prozessname, Fensterhandle und ProzessID ausgeben.

foreach (Process p in Process.GetProcesses())
{
if ((int)p.MainWindowHandle != 0)
{
ListViewItem lva = new ListViewItem(p.MainWindowTitle);
lva.SubItems.AddRange(new string[] { p.ProcessName.ToString() + ".exe", p.MainWindowHandle.ToString(), p.Id.ToString()});
listView2.Items.Add(lva);
}
}


Bei der Abfrage der Reihenfolge komme ich aber leider nicht weiter, da die z-Koordinate der Fenster nicht direkt ermittelt werden kann. Ich habe es mit
IntPtr naechste = GetNextWindow(p.MainWindowHandle, GetWindowConstants.GW_HWNDNEXT);

versucht, allerdings bekomme ich hier einen Handle zurückgegeben, der keinem der drei laufenden Fenster entspricht. Ein weiterer Gedanke von mir war es, den Handle des Desktops zu bestimmen und mit GW_CHILD die Kindfenster zu bestimmen, in der Hoffung es würde sich hierbei um die drei geöffneten Fenster handeln. Aber auch das führte leider nicht zum gewünschten Ergebnis.

Ich hoffe ihr könnt mir helfen :-)

Grüße
Anika
News:
12.04.2011
Anika 223 6
2 Antworten
3
Probier doch mal

public static string GetText(IntPtr hWnd)
{
// Allocate correct string length first
int length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}

public static bool IsVisible(IntPtr hWnd)
{
WINDOWINFO info = new WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
GetWindowInfo(hWnd, ref info);

return (info.dwStyle & ((uint)WindowStyles.WS_VISIBLE)) == (uint)WindowStyles.WS_VISIBLE;
}

public static IEnumerable<string> GetWindowsInZOrder()
{
IntPtr hWnd = GetTopWindow(IntPtr.Zero); //ausgehend vom Desktop das oberste Fenster finden

while (hWnd != IntPtr.Zero)
{
if (IsVisible(hWnd)) // nicht sichtbare Fenster ausschließen
{
yield return GetText(hWnd);
}

hWnd = GetWindow(hWnd, 2); //die z-Achse nach unten hangeln
}
}


Die passenden extern-Deklarationen hast Du vermutlich schon, sonst siehe pinvoke.net.

(mit Dank an stackoverflow)
12.04.2011
Matthias Hlawatsch 13,2k 4 9
1
Habs grad ausprobiert und es funktioniert genau so wie ich es mir vorgestellt habe.

Vielen Dank Matthias :-)
Anika 13.04.2011
1
Könntest du seine bitte Antwort als "richtig" markieren? Danke :-)
Konstantin 13.04.2011
Könntest du seine bitte Antwort als "richtig" markieren? Danke :-)
Konstantin 13.04.2011
0
Habs grad ausprobiert und es funktioniert genau so wie ich es mir vorgestellt habe.

Vielen Dank Matthias :-)
13.04.2011
Anika 223 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH