From da34905fb2e72b49f419a28322c4b88480386db4 Mon Sep 17 00:00:00 2001 From: SugarChes Date: Tue, 18 Aug 2026 19:02:18 +0800 Subject: [PATCH] chore(browser): remove unused lifetime coordinator --- .../CefBrowserLifetimeCoordinator.cs | 1220 ----------------- 插件库/Lskj.Control/Lskj.Control.csproj | 1 - 2 files changed, 1221 deletions(-) delete mode 100644 插件库/Lskj.Control/CefBrowserLifetimeCoordinator.cs diff --git a/插件库/Lskj.Control/CefBrowserLifetimeCoordinator.cs b/插件库/Lskj.Control/CefBrowserLifetimeCoordinator.cs deleted file mode 100644 index 94959bb..0000000 --- a/插件库/Lskj.Control/CefBrowserLifetimeCoordinator.cs +++ /dev/null @@ -1,1220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Threading; -using System.Windows.Forms; -using Lskj.Util; -using Xilium.CefGlue; - -namespace Lskj.Control -{ - /// - /// Keeps an application-owned root HWND alive for the complete CEF - /// lifecycle. The root is created independently of recreatable WinForms - /// control handles, then embedded after CEF reports OnAfterCreated. - /// - internal sealed class CefBrowserLifetimeCoordinator - { - // CEF 生命周期诊断默认关闭,避免正常创建和销毁浏览器时持续写入日志。 - internal static readonly bool LifecycleTracingEnabled = false; - private static readonly CefBrowserSettings _sharedBrowserSettings = - new CefBrowserSettings(); - private readonly object _hostWindowSyncRoot = new object(); - private CefBrowser _browser; - private CefBrowserHostWindow _hostWindow; - private int _browserCreationPending; - private int _browserCloseRequested; - private int _browserCloseApproved; - private int _browserBeforeCloseReceived; - private int _disposeRequested; - private int _ownerHandleDestroying; - - public CefBrowser Browser - { - get { return Interlocked.CompareExchange(ref _browser, null, null); } - } - - public static CefBrowserSettings SharedBrowserSettings - { - get { return _sharedBrowserSettings; } - } - - public bool IsDisposing - { - get { return Thread.VolatileRead(ref _disposeRequested) != 0; } - } - - public bool IsUnavailable - { - get - { - return IsDisposing || - Thread.VolatileRead(ref _ownerHandleDestroying) != 0; - } - } - - public bool HasBrowserOrPendingCreation - { - get - { - return Browser != null || - Thread.VolatileRead(ref _browserCreationPending) != 0; - } - } - - public IntPtr GetCreationParentHandle( - IntPtr ownerHandle, - int width, - int height) - { - if (ownerHandle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(ownerHandle)) - throw new ArgumentException( - "A valid WinForms owner handle is required.", - "ownerHandle"); - - CefBrowserHostWindow hostWindow; - lock (_hostWindowSyncRoot) - { - if (_hostWindow == null || _hostWindow.IsDestroyed) - { - _hostWindow = new CefBrowserHostWindow( - ownerHandle, - width, - height, - HostWindowCloseRequested, - HostWindowDestroyed); - } - - hostWindow = _hostWindow; - } - - IntPtr hostHandle = hostWindow.Handle; - bool hostValid = hostHandle != IntPtr.Zero && - CefBrowserNativeMethods.IsWindow(hostHandle); - bool ownerValid = CefBrowserNativeMethods.IsWindow(ownerHandle); - TraceClose( - "creation-parent hostHwnd=" + hostHandle + - " hostValid=" + hostValid + - " hostParent=" + CefBrowserNativeMethods.GetParent(hostHandle) + - " ownerHwnd=" + ownerHandle + - " ownerValid=" + ownerValid + - " hostThread=" + hostWindow.OwnerThreadId + - " ownerThread=" + CefBrowserNativeMethods.GetWindowThread(ownerHandle), - null, - null); - - if (!hostValid || !ownerValid) - throw new InvalidOperationException( - "CEF browser creation requires live host and owner HWNDs."); - - return hostHandle; - } - - public bool TryBeginBrowserCreation() - { - if (IsUnavailable || Browser != null) - return false; - - if (Interlocked.CompareExchange(ref _browserCreationPending, 1, 0) != 0) - return false; - - if (!CefBrowserRuntimeLifetime.TryRegister(this)) - { - Interlocked.Exchange(ref _browserCreationPending, 0); - return false; - } - - Interlocked.Exchange(ref _browserCloseApproved, 0); - Interlocked.Exchange(ref _browserBeforeCloseReceived, 0); - if (!IsUnavailable) - return true; - - BrowserCreationFailed(); - return false; - } - - public void BrowserCreationFailed() - { - Interlocked.Exchange(ref _browserCreationPending, 0); - RequestHostWindowDestroy("creation-failed"); - TryReleaseHostWindow(); - CefBrowserRuntimeLifetime.Unregister(this); - } - - public bool BrowserCreated(CefBrowser browser) - { - if (browser == null) - throw new ArgumentNullException("browser"); - - Interlocked.Exchange(ref _browserCreationPending, 0); - var currentBrowser = Interlocked.CompareExchange( - ref _browser, - browser, - null); - TraceClose("created", browser, currentBrowser); - - if (currentBrowser != null && !IsSameBrowser(currentBrowser, browser)) - { - CloseBrowser(browser, true); - return false; - } - - if (IsUnavailable) - { - RequestClose(IsDisposing); - return false; - } - - return true; - } - - public bool BrowserClosed(CefBrowser browser, Action clearOwnerBrowser) - { - var currentBrowser = Browser; - bool sameBrowser = currentBrowser != null && - IsSameBrowser(currentBrowser, browser); - TraceClose( - "on-before-close same=" + sameBrowser, - browser, - currentBrowser); - if (!sameBrowser) - return false; - - if (clearOwnerBrowser != null) - clearOwnerBrowser(); - - if (currentBrowser != null) - Interlocked.CompareExchange(ref _browser, null, currentBrowser); - - Interlocked.Exchange(ref _browserBeforeCloseReceived, 1); - Interlocked.Exchange(ref _browserCloseRequested, 0); - RequestHostWindowDestroy("on-before-close"); - TryReleaseHostWindow(); - DisposeBrowserReference(currentBrowser); - CefBrowserRuntimeLifetime.Unregister(this); - return true; - } - - public bool BrowserClosing(CefBrowser browser) - { - var currentBrowser = Browser; - bool sameBrowser = currentBrowser != null && - IsSameBrowser(currentBrowser, browser); - TraceClose( - "do-close same=" + sameBrowser, - browser, - currentBrowser); - if (sameBrowser) - { - // DoClose runs after onbeforeunload has been accepted. Make the - // stable host top-level before returning so CEF's WM_CLOSE is - // never sent to the WPF root window. - bool parked = ParkBrowser(browser, "do-close"); - if (!parked) - { - // Suppress CEF's OS close event when the stable host could - // not be detached. Destroying the application-owned host - // is the non-standard-window equivalent of cefclient's - // DestroyRender path and avoids targeting the WPF root. - RequestHostWindowDestroy("do-close-park-failed"); - return true; - } - - Interlocked.Exchange(ref _browserCloseApproved, 1); - } - - // Match CEF's documented non-standard close flow. Returning false - // makes CEF send WM_CLOSE after this callback returns. The parked - // application-owned host handles that message and destroys itself. - return false; - } - - public void RequestClose() - { - RequestClose(false); - } - - private void RequestClose(bool forceClose) - { - var browser = Browser; - if (browser == null) - return; - - // Suppress only duplicate dispatches. The flag is reset as soon as - // CloseBrowser is delivered so a canceled onbeforeunload can be - // retried. A forced dispose is always allowed to upgrade a pending - // non-forced close. - if (!forceClose && - Interlocked.Exchange(ref _browserCloseRequested, 1) != 0) - return; - - Interlocked.Exchange(ref _browserCloseRequested, 1); - if (forceClose) - ParkBrowser(browser, "forced-close-request"); - - CloseBrowser(browser, forceClose); - } - - public void BeginDispose() - { - if (Interlocked.Exchange(ref _disposeRequested, 1) != 0) - return; - - Interlocked.Exchange(ref _ownerHandleDestroying, 1); - TraceOwnerAction("owner-dispose"); - RequestClose(true); - TryReleaseHostWindow(); - } - - public void BeginOwnerHandleDestruction() - { - if (IsDisposing || - Interlocked.Exchange(ref _ownerHandleDestroying, 1) != 0) - return; - - // WinForms can recreate a control HWND for DPI, parenting or style - // changes. Preserve the browser and only detach its stable host. - TraceOwnerAction("owner-handle-destroy"); - ParkBrowser(Browser, "owner-handle-destroy"); - } - - public void OwnerHandleCreated( - IntPtr ownerHandle, - int width, - int height) - { - if (IsDisposing || ownerHandle == IntPtr.Zero) - return; - - Interlocked.Exchange(ref _ownerHandleDestroying, 0); - var hostWindow = GetHostWindow(); - var browser = Browser; - if (hostWindow != null && !hostWindow.IsDestroyed && browser != null) - hostWindow.AttachTo(ownerHandle, width, height, true); - - TraceClose( - "owner-handle-created ownerHwnd=" + ownerHandle + - " ownerThread=" + CefBrowserNativeMethods.GetWindowThread(ownerHandle), - Browser, - null); - } - - public void AttachBrowserToOwner( - CefBrowser browser, - IntPtr ownerHandle, - int width, - int height) - { - if (browser == null || ownerHandle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(ownerHandle) || - IsUnavailable) - return; - - var currentBrowser = Browser; - if (currentBrowser == null || !IsSameBrowser(currentBrowser, browser)) - return; - - try - { - var hostWindow = GetHostWindow(); - if (hostWindow == null || hostWindow.IsDestroyed) - return; - - IntPtr browserHandle; - using (var browserHost = browser.GetHost()) - { - browserHandle = browserHost.GetWindowHandle(); - } - IntPtr hostHandle = hostWindow.Handle; - if (browserHandle == IntPtr.Zero || hostHandle == IntPtr.Zero) - return; - - IntPtr browserParent = CefBrowserNativeMethods.GetParent(browserHandle); - if (browserParent != hostHandle) - { - TraceClose( - "attach-invalid-parent browserHwnd=" + browserHandle + - " browserParent=" + browserParent + - " hostHwnd=" + hostHandle, - browser, - currentBrowser); - return; - } - - hostWindow.AttachTo(ownerHandle, width, height, true); - ResizeBrowserWindow(browserHandle, width, height, true); - TraceClose( - "attach browserHwnd=" + browserHandle + - " hostHwnd=" + hostHandle + - " hostParent=" + CefBrowserNativeMethods.GetParent(hostHandle) + - " hostThread=" + hostWindow.OwnerThreadId + - " ownerThread=" + CefBrowserNativeMethods.GetWindowThread(ownerHandle), - browser, - currentBrowser); - } - catch (Exception ex) - { - TraceClose( - "attach-failed " + ex.GetType().FullName, - browser, - currentBrowser); - } - } - - public void ResizeBrowser( - IntPtr browserHandle, - int width, - int height) - { - if (browserHandle == IntPtr.Zero || IsUnavailable) - return; - - try - { - var hostWindow = GetHostWindow(); - if (hostWindow == null || hostWindow.IsDestroyed) - return; - - hostWindow.Resize(width, height); - ResizeBrowserWindow(browserHandle, width, height, false); - } - catch (Exception) - { - } - } - - private bool ParkBrowser(CefBrowser browser, string reason) - { - var hostWindow = GetHostWindow(); - if (hostWindow == null || hostWindow.IsDestroyed) - return false; - - try - { - bool parked = hostWindow.Park(); - TraceClose( - "park reason=" + reason + - " parked=" + parked + - " hostHwnd=" + hostWindow.Handle + - " hostParent=" + - CefBrowserNativeMethods.GetParent(hostWindow.Handle), - browser, - Browser); - return parked; - } - catch (Exception ex) - { - TraceClose( - "park-failed " + ex.GetType().FullName, - browser, - Browser); - return false; - } - } - - private static void ResizeBrowserWindow( - IntPtr browserHandle, - int width, - int height, - bool show) - { - uint flags = CefBrowserNativeMethods.SwpNoZOrder | - CefBrowserNativeMethods.SwpNoActivate; - if (show) - flags |= CefBrowserNativeMethods.SwpShowWindow; - - CefBrowserNativeMethods.SetWindowPos( - browserHandle, - IntPtr.Zero, - 0, - 0, - Math.Max(1, width), - Math.Max(1, height), - flags); - } - - private CefBrowserHostWindow GetHostWindow() - { - lock (_hostWindowSyncRoot) - { - return _hostWindow; - } - } - - private bool HostWindowCloseRequested() - { - bool approved = - Thread.VolatileRead(ref _browserCloseApproved) != 0; - TraceClose( - "host-wm-close approved=" + approved, - Browser, - null); - if (!approved) - RequestClose(IsDisposing); - return approved; - } - - private void HostWindowDestroyed(CefBrowserHostWindow hostWindow) - { - TraceClose( - "host-destroyed hostHwnd=" + hostWindow.LastHandle, - Browser, - null); - TryReleaseHostWindow(); - } - - private void RequestHostWindowDestroy(string reason) - { - var hostWindow = GetHostWindow(); - if (hostWindow == null || hostWindow.IsDestroyed) - return; - - TraceClose( - "host-destroy-request reason=" + reason + - " hostHwnd=" + hostWindow.Handle + - " valid=" + CefBrowserNativeMethods.IsWindow(hostWindow.Handle), - Browser, - null); - hostWindow.RequestDestroy(); - } - - private void TryReleaseHostWindow() - { - var hostWindow = GetHostWindow(); - if (hostWindow == null) - return; - - bool browserFinished = Browser == null && - Thread.VolatileRead(ref _browserCreationPending) == 0; - if (!browserFinished) - return; - - bool closeCompleted = - Thread.VolatileRead(ref _browserBeforeCloseReceived) != 0; - if (!hostWindow.IsDestroyed) - { - if (IsDisposing || closeCompleted) - RequestHostWindowDestroy("release-ready"); - return; - } - - lock (_hostWindowSyncRoot) - { - if (ReferenceEquals(_hostWindow, hostWindow) && - Browser == null && - Thread.VolatileRead(ref _browserCreationPending) == 0) - { - _hostWindow = null; - } - } - - TraceClose( - "release-complete hostHwnd=" + hostWindow.LastHandle + - " browserClosed=" + closeCompleted, - null, - null); - } - - private static bool IsSameBrowser(CefBrowser left, CefBrowser right) - { - if (ReferenceEquals(left, right)) - return true; - if (left == null || right == null) - return false; - - try - { - return left.IsSame(right); - } - catch (Exception) - { - try - { - return left.Identifier == right.Identifier; - } - catch (Exception) - { - return false; - } - } - } - - private void CloseBrowser(CefBrowser browser, bool forceClose) - { - try - { - TraceClose( - "close-request force=" + forceClose, - browser, - null); - if (CefRuntime.CurrentlyOn(CefThreadId.UI)) - { - ExecuteCloseBrowser(browser, forceClose); - return; - } - - bool posted = CefRuntime.PostTask( - CefThreadId.UI, - new CefActionTask(delegate - { - ExecuteCloseBrowser(browser, forceClose); - })); - TraceClose("close-post-ui accepted=" + posted, browser, null); - if (!posted) - ExecuteCloseBrowser(browser, forceClose); - } - catch (Exception ex) - { - BrowserCloseFailed(browser, ex); - } - } - - private void ExecuteCloseBrowser(CefBrowser browser, bool forceClose) - { - try - { - TraceClose( - "close-execute-ui force=" + forceClose, - browser, - null); - using (var browserHost = browser.GetHost()) - { - browserHost.CloseBrowser(forceClose); - } - } - catch (Exception ex) - { - BrowserCloseFailed(browser, ex); - } - finally - { - Interlocked.Exchange(ref _browserCloseRequested, 0); - } - } - - private static void DisposeBrowserReference(CefBrowser browser) - { - if (browser == null) - return; - - try - { - browser.Dispose(); - } - catch (Exception ex) - { - TraceClose( - "browser-reference-dispose-failed " + ex.GetType().FullName, - null, - null); - } - } - - private void BrowserCloseFailed(CefBrowser browser, Exception exception) - { - TraceClose( - "close-failed " + exception.GetType().FullName, - browser, - Browser); - Interlocked.Exchange(ref _browserCloseRequested, 0); - if (IsDisposing) - RequestHostWindowDestroy("close-failed"); - TryReleaseHostWindow(); - } - - private void TraceOwnerAction(string action) - { - if (!LifecycleTracingEnabled) - return; - - string stack = Environment.StackTrace - .Replace("\r", string.Empty) - .Replace("\n", " | "); - if (stack.Length > 1800) - stack = stack.Substring(0, 1800); - - TraceClose(action + " stack=" + stack, Browser, null); - } - - private static void TraceClose( - string action, - CefBrowser browser, - CefBrowser currentBrowser) - { - if (!LifecycleTracingEnabled) - return; - - try - { - LogHelper.Instance.WriteLog( - "[CEF_LIFECYCLE] " + action + - "; browser=" + GetBrowserIdentifier(browser) + - "; current=" + GetBrowserIdentifier(currentBrowser) + - "; thread=" + Thread.CurrentThread.ManagedThreadId + - "; cefUi=" + CefRuntime.CurrentlyOn(CefThreadId.UI)); - } - catch (Exception) - { - } - } - - private static string GetBrowserIdentifier(CefBrowser browser) - { - if (browser == null) - return "null"; - - try - { - return browser.Identifier.ToString(); - } - catch (Exception) - { - return "unavailable"; - } - } - - private sealed class CefBrowserHostWindow : NativeWindow - { - private const int WmClose = 0x0010; - private const int WmReleaseHandle = 0x8001; - private const int WmPark = 0x8002; - private const int WmNcDestroy = 0x0082; - - private readonly uint _ownerThreadId; - private Func _onCloseRequested; - private Action _onDestroyed; - private IntPtr _lastHandle; - private int _destroyRequested; - private int _destroyed; - private int _parked; - private int _parking; - - public uint OwnerThreadId - { - get { return _ownerThreadId; } - } - - public bool IsDestroyed - { - get { return Thread.VolatileRead(ref _destroyed) != 0; } - } - - public bool IsParked - { - get { return Thread.VolatileRead(ref _parked) != 0; } - } - - public IntPtr LastHandle - { - get { return _lastHandle; } - } - - public CefBrowserHostWindow( - IntPtr ownerHandle, - int width, - int height, - Func onCloseRequested, - Action onDestroyed) - { - _onCloseRequested = onCloseRequested; - _onDestroyed = onDestroyed; - _ownerThreadId = CefBrowserNativeMethods.GetCurrentThreadId(); - - uint ownerThread = - CefBrowserNativeMethods.GetWindowThread(ownerHandle); - if (ownerThread != _ownerThreadId) - { - throw new InvalidOperationException( - "CEF host HWND must be created on the WinForms owner thread."); - } - - CreateHandle(new CreateParams - { - Caption = "Lskj.CefBrowserHostWindow", - Parent = IntPtr.Zero, - X = -32000, - Y = -32000, - Width = 1, - Height = 1, - Style = CefBrowserNativeMethods.WsPopup | - CefBrowserNativeMethods.WsClipChildren | - CefBrowserNativeMethods.WsClipSiblings - }); - _lastHandle = Handle; - Interlocked.Exchange(ref _parked, 1); - - if (_lastHandle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(_lastHandle)) - { - throw new InvalidOperationException( - "Failed to create the stable CEF root HWND."); - } - } - - public void AttachTo( - IntPtr ownerHandle, - int width, - int height, - bool show) - { - EnsureOwnerThread(ownerHandle); - if (IsDestroyed || Handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(Handle)) - return; - - int style = CefBrowserNativeMethods.GetWindowLong( - Handle, - CefBrowserNativeMethods.GwlStyle); - CefBrowserNativeMethods.SetWindowLong( - Handle, - CefBrowserNativeMethods.GwlStyle, - (style & ~CefBrowserNativeMethods.WsPopup) | - CefBrowserNativeMethods.WsChild | - CefBrowserNativeMethods.WsClipChildren | - CefBrowserNativeMethods.WsClipSiblings); - CefBrowserNativeMethods.SetParent(Handle, ownerHandle); - if (!CefBrowserNativeMethods.IsWindow(Handle) || - CefBrowserNativeMethods.GetParent(Handle) != ownerHandle) - { - throw new InvalidOperationException( - "Failed to attach the CEF host HWND to its owner."); - } - - uint flags = CefBrowserNativeMethods.SwpNoZOrder | - CefBrowserNativeMethods.SwpNoActivate | - CefBrowserNativeMethods.SwpFrameChanged; - if (show) - flags |= CefBrowserNativeMethods.SwpShowWindow; - CefBrowserNativeMethods.SetWindowPos( - Handle, - IntPtr.Zero, - 0, - 0, - Math.Max(1, width), - Math.Max(1, height), - flags); - Interlocked.Exchange(ref _parked, 0); - } - - public void Resize(int width, int height) - { - if (IsDestroyed || Handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(Handle)) - return; - - CefBrowserNativeMethods.SetWindowPos( - Handle, - IntPtr.Zero, - 0, - 0, - Math.Max(1, width), - Math.Max(1, height), - CefBrowserNativeMethods.SwpNoZOrder | - CefBrowserNativeMethods.SwpNoActivate); - } - - public bool Park() - { - if (IsDestroyed || Handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(Handle)) - return false; - - if (IsParked) - return true; - - if (CefBrowserNativeMethods.GetCurrentThreadId() != - _ownerThreadId) - { - CefBrowserNativeMethods.SendMessage( - Handle, - WmPark, - IntPtr.Zero, - IntPtr.Zero); - return IsParked && - CefBrowserNativeMethods.IsWindow(Handle) && - CefBrowserNativeMethods.GetParent(Handle) == IntPtr.Zero; - } - - return ParkNow(); - } - - private bool ParkNow() - { - if (IsParked) - return true; - if (Interlocked.Exchange(ref _parking, 1) != 0) - return false; - - try - { - IntPtr handle = Handle; - if (IsDestroyed || handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(handle)) - return false; - - CefBrowserNativeMethods.ShowWindow( - handle, - CefBrowserNativeMethods.SwHide); - int style = CefBrowserNativeMethods.GetWindowLong( - handle, - CefBrowserNativeMethods.GwlStyle); - // Win32 requires WS_CHILD to be cleared before setting a - // child window's parent to NULL. Reversing this order can - // leave the host attached to the WPF root while appearing - // parked in managed state. - CefBrowserNativeMethods.SetWindowLong( - handle, - CefBrowserNativeMethods.GwlStyle, - (style & ~CefBrowserNativeMethods.WsChild) | - CefBrowserNativeMethods.WsPopup | - CefBrowserNativeMethods.WsClipChildren | - CefBrowserNativeMethods.WsClipSiblings); - CefBrowserNativeMethods.SetParent(handle, IntPtr.Zero); - if (!CefBrowserNativeMethods.IsWindow(handle) || - CefBrowserNativeMethods.GetParent(handle) != IntPtr.Zero) - return false; - - CefBrowserNativeMethods.SetWindowPos( - handle, - IntPtr.Zero, - -32000, - -32000, - 1, - 1, - CefBrowserNativeMethods.SwpNoZOrder | - CefBrowserNativeMethods.SwpNoActivate | - CefBrowserNativeMethods.SwpFrameChanged); - Interlocked.Exchange(ref _parked, 1); - return true; - } - finally - { - Interlocked.Exchange(ref _parking, 0); - } - } - - public void RequestDestroy() - { - if (Interlocked.Exchange(ref _destroyRequested, 1) != 0) - return; - - IntPtr handle = Handle; - if (handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(handle)) - { - NotifyDestroyed(); - return; - } - - if (CefBrowserNativeMethods.GetCurrentThreadId() == - _ownerThreadId) - { - DestroyNow(); - return; - } - - if (!CefBrowserNativeMethods.PostMessage( - handle, - WmReleaseHandle, - IntPtr.Zero, - IntPtr.Zero)) - { - Interlocked.Exchange(ref _destroyRequested, 0); - TraceClose( - "host-destroy-post-failed hostHwnd=" + handle, - null, - null); - } - } - - protected override void WndProc(ref Message message) - { - if (message.Msg == WmClose) - { - var onCloseRequested = _onCloseRequested; - bool allowClose = onCloseRequested == null || - onCloseRequested(); - if (allowClose) - base.WndProc(ref message); - return; - } - - if (message.Msg == WmReleaseHandle) - { - DestroyNow(); - return; - } - - if (message.Msg == WmPark) - { - ParkNow(); - return; - } - - if (message.Msg == WmNcDestroy) - { - _lastHandle = message.HWnd; - base.WndProc(ref message); - NotifyDestroyed(); - return; - } - - base.WndProc(ref message); - } - - private void DestroyNow() - { - IntPtr handle = Handle; - if (handle == IntPtr.Zero || - !CefBrowserNativeMethods.IsWindow(handle)) - { - NotifyDestroyed(); - return; - } - - TraceClose( - "host-destroying hostHwnd=" + handle, - null, - null); - DestroyHandle(); - } - - private void NotifyDestroyed() - { - if (Interlocked.Exchange(ref _destroyed, 1) != 0) - return; - - _onCloseRequested = null; - var onDestroyed = Interlocked.Exchange( - ref _onDestroyed, - null); - if (onDestroyed != null) - onDestroyed(this); - } - - private void EnsureOwnerThread(IntPtr ownerHandle) - { - EnsureCurrentThread(); - if (CefBrowserNativeMethods.GetWindowThread(ownerHandle) != - _ownerThreadId) - { - throw new InvalidOperationException( - "CEF host and owner HWND must belong to the same thread."); - } - } - - private void EnsureCurrentThread() - { - if (CefBrowserNativeMethods.GetCurrentThreadId() != - _ownerThreadId) - { - throw new InvalidOperationException( - "CEF host HWND may only be changed on its owner thread."); - } - } - } - } - - /// - /// Mirrors the browser list used by CEF's cefsimple application. CEF may - /// only be shut down after every asynchronous OnBeforeClose callback has - /// completed. - /// - public static class CefBrowserRuntimeLifetime - { - private static readonly object _syncRoot = new object(); - private static readonly HashSet - _activeBrowsers = new HashSet(); - private static readonly ManualResetEvent _allBrowsersClosed = - new ManualResetEvent(true); - private static bool _shutdownRequested; - - internal static bool TryRegister( - CefBrowserLifetimeCoordinator coordinator) - { - if (coordinator == null) - throw new ArgumentNullException("coordinator"); - - lock (_syncRoot) - { - if (_shutdownRequested) - return false; - - if (_activeBrowsers.Add(coordinator)) - _allBrowsersClosed.Reset(); - return true; - } - } - - internal static void Unregister( - CefBrowserLifetimeCoordinator coordinator) - { - if (coordinator == null) - return; - - lock (_syncRoot) - { - _activeBrowsers.Remove(coordinator); - if (_activeBrowsers.Count == 0) - _allBrowsersClosed.Set(); - } - } - - public static bool CloseAllBrowsersAndWait(int timeoutMilliseconds) - { - CefBrowserLifetimeCoordinator[] browsers; - lock (_syncRoot) - { - _shutdownRequested = true; - browsers = new CefBrowserLifetimeCoordinator[ - _activeBrowsers.Count]; - _activeBrowsers.CopyTo(browsers); - if (browsers.Length == 0) - return true; - } - - foreach (var browser in browsers) - browser.BeginDispose(); - - bool closed = _allBrowsersClosed.WaitOne( - Math.Max(0, timeoutMilliseconds)); - TraceShutdown(closed, timeoutMilliseconds); - return closed; - } - - private static void TraceShutdown( - bool closed, - int timeoutMilliseconds) - { - if (!CefBrowserLifetimeCoordinator.LifecycleTracingEnabled) - return; - - try - { - int remaining; - lock (_syncRoot) - { - remaining = _activeBrowsers.Count; - } - - LogHelper.Instance.WriteLog( - "[CEF_LIFECYCLE] shutdown-wait closed=" + closed + - "; remaining=" + remaining + - "; timeoutMs=" + timeoutMilliseconds); - } - catch (Exception) - { - } - } - } - - internal static class CefBrowserNativeMethods - { - internal const int GwlStyle = -16; - internal const int SwHide = 0; - internal const int WsChild = 0x40000000; - internal const int WsClipChildren = 0x02000000; - internal const int WsClipSiblings = 0x04000000; - internal const int WsPopup = unchecked((int)0x80000000); - internal const uint SwpNoZOrder = 0x0004; - internal const uint SwpNoActivate = 0x0010; - internal const uint SwpFrameChanged = 0x0020; - internal const uint SwpShowWindow = 0x0040; - - [DllImport("user32.dll", SetLastError = true)] - internal static extern IntPtr SetParent( - IntPtr childWindow, - IntPtr newParentWindow); - - [DllImport("user32.dll")] - internal static extern IntPtr GetParent(IntPtr window); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool IsWindow(IntPtr window); - - [DllImport("user32.dll", SetLastError = true)] - internal static extern int GetWindowLong(IntPtr window, int index); - - [DllImport("user32.dll", SetLastError = true)] - internal static extern int SetWindowLong( - IntPtr window, - int index, - int newValue); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool ShowWindow(IntPtr window, int command); - - [DllImport("user32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool SetWindowPos( - IntPtr window, - IntPtr insertAfter, - int x, - int y, - int width, - int height, - uint flags); - - [DllImport("user32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool PostMessage( - IntPtr window, - int message, - IntPtr wParam, - IntPtr lParam); - - [DllImport("user32.dll")] - internal static extern IntPtr SendMessage( - IntPtr window, - int message, - IntPtr wParam, - IntPtr lParam); - - [DllImport("user32.dll")] - internal static extern uint GetWindowThreadProcessId( - IntPtr window, - IntPtr processId); - - [DllImport("kernel32.dll")] - internal static extern uint GetCurrentThreadId(); - - internal static uint GetWindowThread(IntPtr window) - { - return window == IntPtr.Zero - ? 0 - : GetWindowThreadProcessId(window, IntPtr.Zero); - } - } - - internal sealed class CefActionTask : CefTask - { - private Action _action; - - public CefActionTask(Action action) - { - if (action == null) - throw new ArgumentNullException("action"); - - _action = action; - } - - protected override void Execute() - { - var action = Interlocked.Exchange(ref _action, null); - if (action == null) - return; - - try - { - action(); - } - catch (Exception) - { - // Never propagate managed exceptions into a native CEF task. - } - } - } -} diff --git a/插件库/Lskj.Control/Lskj.Control.csproj b/插件库/Lskj.Control/Lskj.Control.csproj index fcc4469..0b19f93 100644 --- a/插件库/Lskj.Control/Lskj.Control.csproj +++ b/插件库/Lskj.Control/Lskj.Control.csproj @@ -456,7 +456,6 @@ Component -