दिलचस्प पोस्ट
एक्लिप्स में जेबीस डिबगिंग क्या file_get_contents () में समयबाह्य सेटिंग है? रिमैप, नॉरमैप, नॉरमॅप और vnoremap मैपिंग कमांड के बीच अंतर क्या है? बूटस्ट्रैप 3 नेबबार संक्षिप्त करें ग्राफ़ एपीआई 'गलत' या 'असम्बद्ध प्राप्त अनुरोध' सार्वजनिक फेसबुक पेज का उपयोग करता है 1s और 0 के स्ट्रिंग को द्विआधारी मान में परिवर्तित करना सर्वर। ट्रांसफर वि। Response.Redirect पायथन में SQL कथन में चर का उपयोग कैसे करें? कैसे html एट्रिब्यूट्स के अंदर उद्धरण चिह्नों से बचने के लिए? आवधिक आईओएस पृष्ठभूमि स्थान अपडेट ++ ऑपरेटर थ्रेड सुरक्षित है? जावा में एक्सटेंशन के बिना फ़ाइल नाम कैसे प्राप्त करें? कैसे डीबी लोड करने के लिए: स्वचालित रूप से टेस्ट डेटाबेस में बीज डेटा? लिनक्स: एक ही पंक्ति पर एक विशिष्ट शब्द के बाद एक शब्द निकालें उद्देश्य सी में चर नामों से पहले "_" को क्यों रेखांकित करें

विंडो "डेस्कटॉप पर"

मैं कुछ समय के लिए रेनलाइनर का उपयोग कर रहा हूं और मैंने देखा है कि उसे डेस्कटॉप पर "डेस्कटॉप पर" डालने का विकल्प है यह सबसे नीचे की खिड़की की तरह है (सबसे ऊपर के रूप में)

मैं यह कैसे एक WPF app पर कर सकता है?

धन्यवाद

वेब के समाधान से एकत्रित समाधान "विंडो "डेस्कटॉप पर""

मेरा जवाब Win32 एपीआई के संदर्भ में है, जो कि WPF के लिए विशिष्ट नहीं है (और संभवत: सी # से पी / आवेज़ की जरूरत है):

रेनलाइनर के पास दो विकल्प हैं:

  • "डेस्कटॉप पर", यह एक्सप्लोरर डेस्कटॉप विंडो ("प्रोग्राम प्रबंधक") का बच्चा बन जाता है। आप इसे SetParent API के साथ हासिल कर सकते हैं।
  • "ऑन बॉटम" आप जो वर्णन करते हैं – इसके खिड़कियां जेड-ऑर्डर के निचले भाग में रहते हैं, बस डेस्कटॉप के सामने। यह उन्हें आसान करने के लिए शुरू करने के लिए आसान है ( SetWindowPos देखें) – चाल उन्हें सामने आने पर रोक जब क्लिक किया है। मैं WM_WINDOWPOSCHANGING संदेश को संभालने का सुझाव दूंगा

यह वही है जो मैंने इस्तेमाल किया ताकि विंडो हमेशा "नीचे" हो:

using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; 

 [DllImport("user32.dll")] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); const UInt32 SWP_NOSIZE = 0x0001; const UInt32 SWP_NOMOVE = 0x0002; const UInt32 SWP_NOACTIVATE = 0x0010; static readonly IntPtr HWND_BOTTOM = new IntPtr(1); public static void SetBottom(Window window) { IntPtr hWnd = new WindowInteropHelper(window).Handle; SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); } 

चेतावनी स्वीकृत उत्तर बताता है कि आप डेस्कटॉप के एक बच्चे को बनाने के लिए SetParent को कॉल करते हैं। यदि आप ऐसा करते हैं, तो आप Win32 Window Manager को डेस्कटॉप की इनपुट कतार को अपनी चाइल्ड विंडो में सिंक्रनाइज़ करने का कारण बनाते हैं, यह एक बुरी चीज है – रेमंड चेन बताते हैं कि क्यों असल में, अगर आपकी खिड़की लटकती है या ब्लॉक (एक संदेश बॉक्स के साथ कहें) तो आप अपने डेस्कटॉप को लॉक कर देंगे।

OnDesktop संस्करण है कि मैं का उपयोग कर रहा हूँ:

 [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); public static void SetOnDesktop(Window window) { IntPtr hWnd = new WindowInteropHelper(window).Handle; IntPtr hWndProgMan = FindWindow("Progman", "Program Manager"); SetParent(hWnd, hWndProgMan); } 

मुझे प्रोग्राम मैनेजर खिड़की को ढूंढने में कुछ परेशानी हो रही थी, लेकिन रेमलाइनर के निर्माता किममो ने मुझे कोड के लिए लिंक दिया:

http://www.ipi.fi/~rainy/legacy.html

अगर किसी को और अधिक विस्तार की आवश्यकता है तो फ़ंक्शन के लिए लाइब्रेरी / बारिशविंडू सीपीपी में देखें SetWindowZPos

मैं ऐसा करने की कोशिश कर रहा था … मैंने बहुत सारे विचारों का इस्तेमाल किया है, लेकिन मैं इसे करने में सक्षम था और चंचल को रोक रहा था।

मैं WndProc को ओवरराइड करने में कामयाब रहा, इससे पहले एक सेटविंडोपॉप्स को पृष्ठभूमि में डाल दिया, और दूसरा इसे फोकस लेने से रोकने के लिए …

  const UInt32 SWP_NOSIZE = 0x0001; const UInt32 SWP_NOMOVE = 0x0002; const UInt32 SWP_NOACTIVATE = 0x0010; const UInt32 SWP_NOZORDER = 0x0004; const int WM_ACTIVATEAPP = 0x001C; const int WM_ACTIVATE = 0x0006; const int WM_SETFOCUS = 0x0007; static readonly IntPtr HWND_BOTTOM = new IntPtr(1); const int WM_WINDOWPOSCHANGING = 0x0046; [DllImport("user32.dll")] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] static extern IntPtr DeferWindowPos(IntPtr hWinPosInfo, IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] static extern IntPtr BeginDeferWindowPos(int nNumWindows); [DllImport("user32.dll")] static extern bool EndDeferWindowPos(IntPtr hWinPosInfo); private void Window_Loaded(object sender, RoutedEventArgs e) { IntPtr hWnd = new WindowInteropHelper(this).Handle; SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); IntPtr windowHandle = (new WindowInteropHelper(this)).Handle; HwndSource src = HwndSource.FromHwnd(windowHandle); src.AddHook(new HwndSourceHook(WndProc)); } private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_SETFOCUS) { IntPtr hWnd = new WindowInteropHelper(this).Handle; SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); handled = true; } return IntPtr.Zero; } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { IntPtr windowHandle = (new WindowInteropHelper(this)).Handle; HwndSource src = HwndSource.FromHwnd(windowHandle); src.RemoveHook(new HwndSourceHook(this.WndProc)); } 

@HrejWaltz के जवाब की संलग्न संपत्ति संस्करण:

अपडेट (12/28/2016)

 public class WindowSinker { #region Properties const UInt32 SWP_NOSIZE = 0x0001; const UInt32 SWP_NOMOVE = 0x0002; const UInt32 SWP_NOACTIVATE = 0x0010; const UInt32 SWP_NOZORDER = 0x0004; const int WM_ACTIVATEAPP = 0x001C; const int WM_ACTIVATE = 0x0006; const int WM_SETFOCUS = 0x0007; const int WM_WINDOWPOSCHANGING = 0x0046; static readonly IntPtr HWND_BOTTOM = new IntPtr(1); Window Window = null; #endregion #region WindowSinker public WindowSinker(Window Window) { this.Window = Window; } #endregion #region Methods [DllImport("user32.dll")] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] static extern IntPtr DeferWindowPos(IntPtr hWinPosInfo, IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] static extern IntPtr BeginDeferWindowPos(int nNumWindows); [DllImport("user32.dll")] static extern bool EndDeferWindowPos(IntPtr hWinPosInfo); void OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { var Handle = (new WindowInteropHelper(Window)).Handle; var Source = HwndSource.FromHwnd(Handle); Source.RemoveHook(new HwndSourceHook(WndProc)); } void OnLoaded(object sender, RoutedEventArgs e) { var Hwnd = new WindowInteropHelper(Window).Handle; SetWindowPos(Hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); var Handle = (new WindowInteropHelper(Window)).Handle; var Source = HwndSource.FromHwnd(Handle); Source.AddHook(new HwndSourceHook(WndProc)); } IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_SETFOCUS) { hWnd = new WindowInteropHelper(Window).Handle; SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); handled = true; } return IntPtr.Zero; } public void Sink() { Window.Loaded += OnLoaded; Window.Closing += OnClosing; } public void Unsink() { Window.Loaded -= OnLoaded; Window.Closing -= OnClosing; } #endregion } public static class WindowExtensions { #region Always On Bottom public static readonly DependencyProperty SinkerProperty = DependencyProperty.RegisterAttached("Sinker", typeof(WindowSinker), typeof(WindowExtensions), new UIPropertyMetadata(null)); public static WindowSinker GetSinker(DependencyObject obj) { return (WindowSinker)obj.GetValue(SinkerProperty); } public static void SetSinker(DependencyObject obj, WindowSinker value) { obj.SetValue(SinkerProperty, value); } public static readonly DependencyProperty AlwaysOnBottomProperty = DependencyProperty.RegisterAttached("AlwaysOnBottom", typeof(bool), typeof(WindowExtensions), new UIPropertyMetadata(false, OnAlwaysOnBottomChanged)); public static bool GetAlwaysOnBottom(DependencyObject obj) { return (bool)obj.GetValue(AlwaysOnBottomProperty); } public static void SetAlwaysOnBottom(DependencyObject obj, bool value) { obj.SetValue(AlwaysOnBottomProperty, value); } static void OnAlwaysOnBottomChanged(object sender, DependencyPropertyChangedEventArgs e) { var Window = sender as Window; if (Window != null) { if ((bool)e.NewValue) { var Sinker = new WindowSinker(Window); Sinker.Sink(); SetSinker(Window, Sinker); } else { var Sinker = GetSinker(Window); Sinker.Unsink(); SetSinker(Window, null); } } } #endregion }