2016-04-19 2 views
0

トランザクションが処理を開始したらエージェントがウィンドウを閉じるのを防ぐ次のメカニズムを使用しています。WPFウィンドウでXボタンを再表示する方法

私はSetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);WS_SYSMENUの前で~を除去することにより、ビット単位の非復帰しないで結ばれているが、それは飛びませんでした。ボタンを非表示にします

コードは、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(); 
       } 
      }; 

答えて

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)styleにWS_SYSMENUを追加しません。それはstyleに設定されている場合、それはそのフラグを返します。

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

こんにちは、答えをありがとう、私はその日のために終わった、明日それをテストします。 –

関連する問題