【发布时间】: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