none
Z-Order für Fenster bestimmen (ein Fenster über ein anderes legen) RRS feed

  • Frage

  • Hallo,

    Ich würde gerne eine Art HUD für ein Spiel programmieren.
    Dazu möchte ich ein WPF Fenster über das Spiel legen.

    Ist es möglich mein Fenster immer über dem Fenster des Spiels zu halten?
    Also mein WPF-Window sollte nur über dem des Spiels sein, und über kein anderes Fenster, falls ein anderes aktiviert wird.

    Ich habe bereits SetWindowPos versucht, aber mein WPF-Window wird hinter dem Spiel-Fenster eingefügt.

     

    Lg

    Sonntag, 27. November 2011 14:17

Antworten

  • Hallo Peter,

    Deine Frage wurde auch in einem anderen Thread diskutiert. 
    Nachfolgend eine WPF-Version meines dortigen Codes:

    using System;
    using System.Windows;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Windows.Interop;
    
    namespace NotepadHeadUpDisplay {
        public partial class Window1 : Window {
            public Window1() {
                Process p = Process.Start("notepad.exe");
                p.WaitForInputIdle();
                this.ShowInTaskbar = false;
    
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e) {
                Process[] procs = Process.GetProcessesByName("Notepad");
                if (procs.Length != 0) {
                    HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
                    NativeMethods.SetWindowLong(hwndSource.Handle, NativeMethods.GWL_HWNDPARENT, (uint)procs[0].MainWindowHandle);
                }
            }
        }
    
        public class NativeMethods {
            [DllImport("user32.dll")]
            private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
    
            [DllImport("user32.dll")]
            public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
    
            public const int GWL_HWNDPARENT = -8;
        }
    }
    
    

     

    Gruß
    Marcel

    Montag, 28. November 2011 08:49
    Moderator

Alle Antworten

  • Hast du es schon TopMost auspropiert?
    Sonntag, 27. November 2011 14:22
  • Hast du es schon TopMost auspropiert?

    Ja, nur entspricht TopMost nicht meinen Wünschen.

    Ich möchte das zu darauflegende Fenster nicht über allen anderen haben, sondern eben nur über dem Fenster des Spiels (es ist kein Vollbild-Spiel).

    Sonntag, 27. November 2011 14:27
  • Hallo Peter,

    Deine Frage wurde auch in einem anderen Thread diskutiert. 
    Nachfolgend eine WPF-Version meines dortigen Codes:

    using System;
    using System.Windows;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Windows.Interop;
    
    namespace NotepadHeadUpDisplay {
        public partial class Window1 : Window {
            public Window1() {
                Process p = Process.Start("notepad.exe");
                p.WaitForInputIdle();
                this.ShowInTaskbar = false;
    
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e) {
                Process[] procs = Process.GetProcessesByName("Notepad");
                if (procs.Length != 0) {
                    HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
                    NativeMethods.SetWindowLong(hwndSource.Handle, NativeMethods.GWL_HWNDPARENT, (uint)procs[0].MainWindowHandle);
                }
            }
        }
    
        public class NativeMethods {
            [DllImport("user32.dll")]
            private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
    
            [DllImport("user32.dll")]
            public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
    
            public const int GWL_HWNDPARENT = -8;
        }
    }
    
    

     

    Gruß
    Marcel

    Montag, 28. November 2011 08:49
    Moderator
  • Funktioniert danke!
    Montag, 28. November 2011 14:35