如何取消隐藏 WPF 上的 X 按钮 window

How to unhide X button on WPF window

我正在使用以下机制来防止代理关闭 window 一旦交易开始处理,我该如何将它们放回去?

我已经通过在 SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU); 上删除 WS_SYSMENU 前面的 ~ 来绑定取消恢复按位 NOT,但是那没有成功。

隐藏按钮的代码如下 ATM:

        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(); 
                }
            };
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,它 returns 如果它设置在 style.

style | b //sets `b` flag on `style`
style & ~b //clears `b` flag from `style`