Browse Source

fix SD-1728 and other issues with ContextActionsPopups

pull/1/head
Siegfried Pammer 15 years ago
parent
commit
9d9359710d
  1. 35
      src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs

35
src/Main/ICSharpCode.Core.Presentation/ExtendedPopup.cs

@ -10,17 +10,16 @@ using System.Windows.Interop;
namespace ICSharpCode.Core.Presentation namespace ICSharpCode.Core.Presentation
{ {
/// <summary> /// <summary>
/// Description of ExtendedPopup. /// Extends WPF popup to prevent it from being the topmost window on the screen.
/// </summary> /// </summary>
public class ExtendedPopup : Popup public class ExtendedPopup : Popup
{ {
Visibility oldState;
IntPtr hwnd; IntPtr hwnd;
protected override void OnOpened(EventArgs e) protected override void OnOpened(EventArgs e)
{ {
hwnd = ((HwndSource)PresentationSource.FromVisual(Child)).Handle; hwnd = ((HwndSource)PresentationSource.FromVisual(Child)).Handle;
SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, NoChangeFlags);
Application.Current.Activated += ApplicationActivated; Application.Current.Activated += ApplicationActivated;
Application.Current.Deactivated += ApplicationDeactivated; Application.Current.Deactivated += ApplicationDeactivated;
@ -34,25 +33,35 @@ namespace ICSharpCode.Core.Presentation
void ApplicationActivated(object sender, EventArgs e) void ApplicationActivated(object sender, EventArgs e)
{ {
Visibility = oldState; LoggingService.Debug("Application activated!");
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, NoChangeFlags | SWP_SHOWWINDOW);
} }
void ApplicationDeactivated(object sender, EventArgs e) void ApplicationDeactivated(object sender, EventArgs e)
{ {
oldState = Visibility; LoggingService.Debug("Application deactivated!");
Visibility = Visibility.Hidden; SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, NoChangeFlags | SWP_HIDEWINDOW);
} }
#region Win32 API #region Win32 API
const int SWP_NOMOVE = 0x002; // for all possible flags see http://msdn.microsoft.com/en-us/library/ms633545%28VS.85%29.aspx
const int SWP_NOSIZE = 0x001;
const int SWP_NOSIZE = 0x0001;
const int SWP_NOMOVE = 0x0002;
const int SWP_NOACTIVATE = 0x0010;
const int SWP_SHOWWINDOW = 0x0040;
const int SWP_HIDEWINDOW = 0x0080;
// SWP_NOACTIVATE fixes SD-1728 - http://bugtracker.sharpdevelop.net/Default.aspx?p=4&i=1728
static readonly uint NoChangeFlags = SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE;
static readonly IntPtr HWND_TOP = new IntPtr(0);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2); static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_TOP = new IntPtr(0);
[DllImport("user32", EntryPoint="SetWindowPos")] [DllImport("user32.dll", SetLastError=true, EntryPoint="SetWindowPos")]
static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
#endregion #endregion
} }
} }

Loading…
Cancel
Save