Skip to content

Commit 545cbce

Browse files
committed
WinForms - Form minimise set browser size to 0,0
When the form is minimized set the browser window size to 0x0 to reduce resource usage. https://github.com/chromiumembedded/cef/blob/c7701b8a6168f105f2c2d6b239ce3958da3e3f13/tests/cefclient/browser/browser_window_std_win.cc#L89 Issue #2922
1 parent 1824a03 commit 545cbce

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

CefSharp.WinForms/ChromiumWebBrowser.cs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ protected override void OnHandleCreated(EventArgs e)
660660
// NOTE: Had to move the code out of this function otherwise the designer would crash
661661
CreateBrowser();
662662

663-
ResizeBrowser();
663+
ResizeBrowser(Width, Height);
664664
}
665665

666666
base.OnHandleCreated(e);
@@ -771,7 +771,7 @@ void IWebBrowserInternal.OnAfterBrowserCreated(IBrowser browser)
771771
});
772772
}
773773

774-
ResizeBrowser();
774+
ResizeBrowser(Width, Height);
775775

776776
//If Load was called after the call to CreateBrowser we'll call Load
777777
//on the MainFrame
@@ -985,21 +985,38 @@ protected override void OnSizeChanged(EventArgs e)
985985

986986
if (!designMode && initialized)
987987
{
988-
ResizeBrowser();
988+
ResizeBrowser(Width, Height);
989989
}
990990
}
991991

992992
/// <summary>
993993
/// Resizes the browser.
994994
/// </summary>
995-
private void ResizeBrowser()
995+
private void ResizeBrowser(int width, int height)
996996
{
997997
if (IsBrowserInitialized)
998998
{
999-
managedCefBrowserAdapter.Resize(Width, Height);
999+
managedCefBrowserAdapter.Resize(width, height);
10001000
}
10011001
}
10021002

1003+
/// <summary>
1004+
/// When minimized set the browser window size to 0x0 to reduce resource usage.
1005+
/// https://github.com/chromiumembedded/cef/blob/c7701b8a6168f105f2c2d6b239ce3958da3e3f13/tests/cefclient/browser/browser_window_std_win.cc#L87
1006+
/// </summary>
1007+
internal void HideInternal()
1008+
{
1009+
ResizeBrowser(0, 0);
1010+
}
1011+
1012+
/// <summary>
1013+
/// Show the browser (called after previous minimised)
1014+
/// </summary>
1015+
internal void ShowInternal()
1016+
{
1017+
ResizeBrowser(Width, Height);
1018+
}
1019+
10031020
/// <summary>
10041021
/// Raises the <see cref="E:System.Windows.Forms.Control.GotFocus" /> event.
10051022
/// </summary>

CefSharp.WinForms/Internals/ParentFormMessageInterceptor.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ internal class ParentFormMessageInterceptor : NativeWindow, IDisposable
2828
/// </summary>
2929
private Rectangle movingRectangle;
3030

31+
/// <summary>
32+
/// Store the previous window state, used to determine if the
33+
/// Windows was previously <see cref="FormWindowState.Minimized"/>
34+
/// and resume rendering
35+
/// </summary>
36+
private FormWindowState previousWindowState;
37+
3138
/// <summary>
3239
/// Gets or sets the browser.
3340
/// </summary>
@@ -83,12 +90,17 @@ private void ParentParentChanged(object sender, EventArgs e)
8390
{
8491
oldForm.HandleCreated -= OnHandleCreated;
8592
oldForm.HandleDestroyed -= OnHandleDestroyed;
93+
oldForm.Resize -= OnResize;
8694
}
8795
ParentForm = newForm;
8896
if (newForm != null)
8997
{
9098
newForm.HandleCreated += OnHandleCreated;
9199
newForm.HandleDestroyed += OnHandleDestroyed;
100+
newForm.Resize += OnResize;
101+
102+
previousWindowState = newForm.WindowState;
103+
92104
// If newForm's Handle has been created already,
93105
// our event listener won't be called, so call it now.
94106
if (newForm.IsHandleCreated)
@@ -99,6 +111,37 @@ private void ParentParentChanged(object sender, EventArgs e)
99111
}
100112
}
101113

114+
private void OnResize(object sender, EventArgs e)
115+
{
116+
var form = (Form)sender;
117+
118+
if (previousWindowState == form.WindowState)
119+
{
120+
return;
121+
}
122+
123+
switch (form.WindowState)
124+
{
125+
case FormWindowState.Normal:
126+
case FormWindowState.Maximized:
127+
{
128+
if (previousWindowState == FormWindowState.Minimized)
129+
{
130+
Browser?.ShowInternal();
131+
}
132+
break;
133+
}
134+
case FormWindowState.Minimized:
135+
{
136+
Browser?.HideInternal();
137+
138+
break;
139+
}
140+
}
141+
142+
previousWindowState = form.WindowState;
143+
}
144+
102145
/// <summary>
103146
/// Handles the <see cref="E:HandleCreated" /> event.
104147
/// </summary>
@@ -266,6 +309,7 @@ protected virtual void Dispose(bool disposing)
266309
{
267310
ParentForm.HandleCreated -= OnHandleCreated;
268311
ParentForm.HandleDestroyed -= OnHandleDestroyed;
312+
ParentForm.Resize -= OnResize;
269313
ParentForm = null;
270314
}
271315

0 commit comments

Comments
 (0)