externes Programm TopMost

MikeBi

Mitglied
Hallo,

ich habe eine Anwendung die mit TopMost (also immer im Vordergrund) läuft. Aus dieser möchte ich eine andere exe starten, die vor meiner Anwendung angezeigt werden soll. Diese exe existiert schon (z.B. der Windows-Taschenrechner).
Wenn ich das andere Programm starte wird es aber immer hinter meiner Anwendung angezeigt. Wie kann ich der anderen Anwendung sagen, das sie als TopMost oder das sie evt. meine Anwendung als Owner hat.
Ich habe schon ein paar Test mit setWindowPos gemacht aber bisher keinen Erfolg gehabt.
Vielleicht hat einer von Euch eine Idee.

Mike
 
Laut SetWindowPos-Dokumentation sollte es ausreichen für das externe Programm für den Parameter "hWndInsertAfter" den Wert 0 (HWND_TOP) zu wählen. (Nicht getestet)
Habs mal eben getestet.
HWND_TOPMOST:
holt den Rechner zwar nach vorne aber wenn die Form dann wieder den Fokus bekommt verschwindet der Rechner hinter der Form.

HWND_TOP:
Holt den Rechner nicht in den Vordergrund.

HWND_TOP nachdem die Form als Parent des Rechners deklariert wurde:
Rechner wird nach vorne geholt und bleibt auch dann im Vordergrund wenn die Form wieder den Fokus bekommt.

//e Code vergessen ... könnt ja Hilfreich sein ;)
C#:
public enum HWND
{            
	HWND_TOP = 0,            
	HWND_BOTTOM = 1,            
	HWND_TOPMOST = -1,            
	HWND_NOTOPMOST = -2
}
		
public enum SetWindowPosFlags : uint
{
	NOSIZE = 0x0001,
	NOMOVE = 0x0002,
	NOZORDER = 0x0004,
	NOREDRAW = 0x0008,
	NOACTIVATE = 0x0010,
	DRAWFRAME = 0x0020,
	FRAMECHANGED = 0x0020,
	SHOWWINDOW = 0x0040,
	HIDEWINDOW = 0x0080,
	NOCOPYBITS = 0x0100,
	NOOWNERZORDER = 0x0200,
	NOREPOSITION = 0x0200,
	NOSENDCHANGING = 0x0400,
	DEFERERASE = 0x2000,
	ASYNCWINDOWPOS = 0x4000
}

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

private void button1_Click(object sender, EventArgs e)
{
	IntPtr hwnd = FindWindowByCaption(IntPtr.Zero, "Rechner");

	SetParent(hwnd, this.Handle);

	SetWindowPos(hwnd, new IntPtr((int)HWND.HWND_TOP), 0, 0, 0, 0, SetWindowPosFlags.NOMOVE | SetWindowPosFlags.NOSIZE );
}
 
Zuletzt bearbeitet:
Ich bekomme es zwar so hin, das die Anwendung über allen normalen Fenstern angezeigt wird, aber da meine Anwendung auch TopMost ist, wird die andere Anwendung immer noch hinter meiner angezeigt. Ich habe keine Ahnung, wie Windows die Reihenfolge festlegt, wenn 2 Anwendungen TopMost haben.
Danke für Eure Ideen.

Mike
 
Zurück