Как отобразить кнопку X в окне WPF

Я использую следующий механизм, который запрещает агентам закрывать окно после начала обработки транзакции. Как мне их вернуть?

Я связал, не возвращая побитовое НЕ, удалив ~ перед WS_SYSMENU на SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU); но это не летало.

Код, который скрывает кнопки, выглядит следующим образом:

        public class WithoutCloseButton : Window
        {
            private const int GWL_STYLE = -16;
            private const int WS_SYSMENU = 0x80000;

            [DllImport("user32.dll", SetLastError = true)]
            private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
            [DllImport("user32.dll")]
            private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

            public void HideButtons()
            {
                var hwnd = new WindowInteropHelper(this).Handle;
                SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
            }

            public void ShowButtons()
            {
                var hwnd = new WindowInteropHelper(this).Handle;
                SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);
            }
        }


private void OpenBrowser(PaymentViewModel viewModel, Uri uri)
        {
            viewModel.BrowserWindow = new WithoutCloseButton();
            viewModel.BrowserWindow.Closed += BrowserWindow_Closed;
            var browser = new MyWebBrowser();
            var scrollviewer = new ScrollViewer();
            var stackPanel = new StackPanel { Orientation = System.Windows.Controls.Orientation.Vertical};
            var formsHost = new WindowsFormsHost {Child = browser};
            stackPanel.Children.Add(formsHost);
            scrollviewer.Content = stackPanel;
            viewModel.BrowserWindow.Content = scrollviewer;

            viewModel.BrowserWindow.Width = browser.Width = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
            viewModel.BrowserWindow.Height = browser.Height = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
            viewModel.BrowserWindow.Top = viewModel.BrowserWindow.Left = 0;
            viewModel.BrowserWindow.Show();

            browser.Show();
            browser.Navigate("about:blank");
            browser.DocumentCompleted += delegate(object obj, WebBrowserDocumentCompletedEventArgs e)
            {
                var urlInLower = e.Url.ToString().ToLower();
                if (urlInLower == "about:blank")
                {
                    ((MyWebBrowser)obj).Navigate(uri);
                }

                if (urlInLower.Contains("accepted"))
                {
                    ViewModel.AuthCode = this.GetAuthToken();
                    ViewModel.updateUiWhenDoneWithPayment_RunWorkerCompleted(new object(), null);
                    ViewModel.BrowserWindow.Close();
                    ViewModel.BrowserWindow = null;
                }

                if (urlInLower.Contains("payment/processing"))
                {
                    viewModel.BrowserWindow.HideButtons();
                }

                if (urlInLower.Contains("payment/error"))
                {
                    viewModel.BrowserWindow.ShowButtons(); 
                }
            };

1 ответ

Решение
public void ShowButtons()
{
    var hwnd = new WindowInteropHelper(this).Handle;
    //SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);
    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_SYSMENU);
}

&(and) не добавляет WS_SYSMENU в style, он возвращает этот флаг, если он установлен на style,

style | b //sets `b` flag on `style`
style & ~b //clears `b` flag from `style`
Другие вопросы по тегам