【问题标题】:How to unhide X button on WPF window如何取消隐藏 WPF 窗口上的 X 按钮
【发布时间】:2016-04-19 16:08:00
【问题描述】:

我正在使用以下机制来防止代理在事务开始处理后关闭窗口我如何将它们放回去?

我已经通过在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(); 
                }
            };

【问题讨论】:

    标签: c# wpf winforms webbrowser-control window-handles


    【解决方案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`
    

    【讨论】:

    • 您好,感谢您的回答,我今天完成了,明天将测试它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2011-09-25
    • 2021-08-26
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多